<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[166454] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/166454">166454</a></dd>
<dt>Author</dt> <dd>weinig@apple.com</dd>
<dt>Date</dt> <dd>2014-03-29 13:03:15 -0700 (Sat, 29 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Convert yet more of HTMLConverter to C++
https://bugs.webkit.org/show_bug.cgi?id=130850

Reviewed by Anders Carlsson.

* editing/cocoa/HTMLConverter.mm:
(HTMLConverterCaches::isAncestorsOfStartToBeConverted):
(HTMLConverter::HTMLConverter):
(HTMLConverter::~HTMLConverter):
(HTMLConverter::convert):
(HTMLConverter::computedAttributesForElement):
(HTMLConverter::attributesForElement):
(HTMLConverter::_newParagraphForElement):
(HTMLConverter::_newLineForElement):
(HTMLConverter::_newTabForElement):
(HTMLConverter::_addAttachmentForElement):
(HTMLConverter::_addQuoteForElement):
(HTMLConverter::_addValue):
(HTMLConverter::_processHeadElement):
(HTMLConverter::_enterElement):
(HTMLConverter::_addTableCellForElement):
(HTMLConverter::_processElement):
(HTMLConverter::_addMarkersToList):
(HTMLConverter::_exitElement):
(HTMLConverter::_processText):
(HTMLConverter::_traverseNode):
(HTMLConverter::_traverseFooterNode):
(WebCore::attributedStringFromRange):
(_childrenForNode): Deleted.
(HTMLConverter::_computedAttributesForElement): Deleted.
(HTMLConverter::_attributesForElement): Deleted.
(HTMLConverter::_loadFromDOMRange): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreeditingcocoaHTMLConvertermm">trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (166453 => 166454)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-03-29 17:54:31 UTC (rev 166453)
+++ trunk/Source/WebCore/ChangeLog        2014-03-29 20:03:15 UTC (rev 166454)
</span><span class="lines">@@ -1,3 +1,38 @@
</span><ins>+2014-03-27  Sam Weinig  &lt;sam@webkit.org&gt;
+
+        Convert yet more of HTMLConverter to C++
+        https://bugs.webkit.org/show_bug.cgi?id=130850
+
+        Reviewed by Anders Carlsson.
+
+        * editing/cocoa/HTMLConverter.mm:
+        (HTMLConverterCaches::isAncestorsOfStartToBeConverted):
+        (HTMLConverter::HTMLConverter):
+        (HTMLConverter::~HTMLConverter):
+        (HTMLConverter::convert):
+        (HTMLConverter::computedAttributesForElement):
+        (HTMLConverter::attributesForElement):
+        (HTMLConverter::_newParagraphForElement):
+        (HTMLConverter::_newLineForElement):
+        (HTMLConverter::_newTabForElement):
+        (HTMLConverter::_addAttachmentForElement):
+        (HTMLConverter::_addQuoteForElement):
+        (HTMLConverter::_addValue):
+        (HTMLConverter::_processHeadElement):
+        (HTMLConverter::_enterElement):
+        (HTMLConverter::_addTableCellForElement):
+        (HTMLConverter::_processElement):
+        (HTMLConverter::_addMarkersToList):
+        (HTMLConverter::_exitElement):
+        (HTMLConverter::_processText):
+        (HTMLConverter::_traverseNode):
+        (HTMLConverter::_traverseFooterNode):
+        (WebCore::attributedStringFromRange):
+        (_childrenForNode): Deleted.
+        (HTMLConverter::_computedAttributesForElement): Deleted.
+        (HTMLConverter::_attributesForElement): Deleted.
+        (HTMLConverter::_loadFromDOMRange): Deleted.
+
</ins><span class="cx"> 2014-03-28  Csaba Osztrogonác  &lt;ossy@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed buildfix after r166441 and r166443.
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingcocoaHTMLConvertermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm (166453 => 166454)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm        2014-03-29 17:54:31 UTC (rev 166453)
+++ trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm        2014-03-29 20:03:15 UTC (rev 166454)
</span><span class="lines">@@ -27,31 +27,28 @@
</span><span class="cx"> #import &quot;HTMLConverter.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #import &quot;ArchiveResource.h&quot;
</span><del>-#import &quot;CachedImage.h&quot;
-#import &quot;ColorMac.h&quot;
</del><span class="cx"> #import &quot;CSSComputedStyleDeclaration.h&quot;
</span><span class="cx"> #import &quot;CSSParser.h&quot;
</span><span class="cx"> #import &quot;CSSPrimitiveValue.h&quot;
</span><ins>+#import &quot;CachedImage.h&quot;
</ins><span class="cx"> #import &quot;CharacterData.h&quot;
</span><ins>+#import &quot;ColorMac.h&quot;
</ins><span class="cx"> #import &quot;Document.h&quot;
</span><span class="cx"> #import &quot;DocumentLoader.h&quot;
</span><del>-#import &quot;DOMCSSPrimitiveValueInternal.h&quot;
-#import &quot;DOMCharacterDataInternal.h&quot;
-#import &quot;DOMDocumentInternal.h&quot;
-#import &quot;DOMElementInternal.h&quot;
-#import &quot;DOMHTMLTableCellElement.h&quot;
-#import &quot;DOMNodeInternal.h&quot;
-#import &quot;DOMPrivate.h&quot;
-#import &quot;DOMRGBColorInternal.h&quot;
-#import &quot;DOMRangeInternal.h&quot;
</del><span class="cx"> #import &quot;Element.h&quot;
</span><ins>+#import &quot;ElementTraversal.h&quot;
</ins><span class="cx"> #import &quot;Font.h&quot;
</span><span class="cx"> #import &quot;Frame.h&quot;
</span><span class="cx"> #import &quot;FrameLoader.h&quot;
</span><span class="cx"> #import &quot;HTMLElement.h&quot;
</span><span class="cx"> #import &quot;HTMLFrameElementBase.h&quot;
</span><ins>+#import &quot;HTMLInputElement.h&quot;
+#import &quot;HTMLMetaElement.h&quot;
</ins><span class="cx"> #import &quot;HTMLNames.h&quot;
</span><ins>+#import &quot;HTMLOListElement.h&quot;
</ins><span class="cx"> #import &quot;HTMLParserIdioms.h&quot;
</span><ins>+#import &quot;HTMLTableCellElement.h&quot;
+#import &quot;HTMLTextAreaElement.h&quot;
</ins><span class="cx"> #import &quot;LoaderNSURLExtras.h&quot;
</span><span class="cx"> #import &quot;RGBColor.h&quot;
</span><span class="cx"> #import &quot;RenderImage.h&quot;
</span><span class="lines">@@ -419,7 +416,7 @@
</span><span class="cx">     PassRefPtr&lt;CSSValue&gt; inlineStylePropertyForElement(Element&amp;, CSSPropertyID);
</span><span class="cx"> 
</span><span class="cx">     Node* cacheAncestorsOfStartToBeConverted(const Range&amp;);
</span><del>-    bool isAncestorsOfStartToBeConverted(Node* node) const { return m_ancestorsUnderCommonAncestor.contains(node); }
</del><ins>+    bool isAncestorsOfStartToBeConverted(Node&amp; node) const { return m_ancestorsUnderCommonAncestor.contains(&amp;node); }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     HashMap&lt;Element*, std::unique_ptr&lt;ComputedStyleExtractor&gt;&gt; m_computedStyles;
</span><span class="lines">@@ -441,31 +438,25 @@
</span><span class="cx"> 
</span><span class="cx"> class HTMLConverter {
</span><span class="cx"> public:
</span><del>-    HTMLConverter(DOMRange*);
</del><ins>+    HTMLConverter(Range&amp;);
</ins><span class="cx">     ~HTMLConverter();
</span><span class="cx">     
</span><del>-    NSAttributedString* convert()
-    {
-        _loadFromDOMRange();
-        if (_errorCode)
-            return nil;
-        return [[_attrStr retain] autorelease];
-    }
</del><ins>+    NSAttributedString* convert();
</ins><span class="cx">     
</span><span class="cx"> private:
</span><ins>+    Ref&lt;Range&gt; m_range;
+    DocumentLoader* m_dataSource;
+    
</ins><span class="cx">     HashMap&lt;RefPtr&lt;Element&gt;, RetainPtr&lt;NSDictionary&gt;&gt; m_attributesForElements;
</span><ins>+    HashMap&lt;RetainPtr&lt;NSTextTable&gt;, RefPtr&lt;Element&gt;&gt; m_textTableFooters;
</ins><span class="cx">     HashMap&lt;RefPtr&lt;Element&gt;, RetainPtr&lt;NSMutableDictionary&gt;&gt; m_aggregatedAttributesForElements;
</span><span class="cx"> 
</span><span class="cx">     NSMutableAttributedString *_attrStr;
</span><span class="cx">     NSMutableDictionary *_documentAttrs;
</span><span class="cx">     NSURL *_baseURL;
</span><del>-    DOMDocument *_document;
-    DOMRange *_domRange;
-    WebCore::DocumentLoader *_dataSource;
</del><span class="cx">     NSMutableArray *_textLists;
</span><span class="cx">     NSMutableArray *_textBlocks;
</span><span class="cx">     NSMutableArray *_textTables;
</span><del>-    NSMutableDictionary *_textTableFooters;
</del><span class="cx">     NSMutableArray *_textTableSpacings;
</span><span class="cx">     NSMutableArray *_textTablePaddings;
</span><span class="cx">     NSMutableArray *_textTableRows;
</span><span class="lines">@@ -476,7 +467,6 @@
</span><span class="cx">     
</span><span class="cx">     CGFloat _defaultTabInterval;
</span><span class="cx">     NSUInteger _domRangeStartIndex;
</span><del>-    NSInteger _errorCode;
</del><span class="cx">     NSInteger _quoteLevel;
</span><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;HTMLConverterCaches&gt; _caches;
</span><span class="lines">@@ -489,51 +479,49 @@
</span><span class="cx">         unsigned int pad:26;
</span><span class="cx">     } _flags;
</span><span class="cx">     
</span><del>-    void _loadFromDOMRange();
-
</del><span class="cx">     PlatformColor *_colorForElement(Element&amp;, CSSPropertyID);
</span><span class="cx">     
</span><del>-    void _traverseNode(Node* node, unsigned depth, bool embedded);
-    void _traverseFooterNode(DOMNode *node, NSInteger depth);
</del><ins>+    void _traverseNode(Node&amp;, unsigned depth, bool embedded);
+    void _traverseFooterNode(Element&amp;, unsigned depth);
</ins><span class="cx">     
</span><del>-    NSDictionary *_computedAttributesForElement(Element&amp;);
-    NSDictionary *_attributesForElement(DOMElement *);
-    NSDictionary* attributesForElement(Element&amp; element);
-    NSDictionary* aggregatedAttributesForAncestors(CharacterData&amp;);
</del><ins>+    NSDictionary *computedAttributesForElement(Element&amp;);
+    NSDictionary *attributesForElement(Element&amp;);
+    NSDictionary *aggregatedAttributesForAncestors(CharacterData&amp;);
</ins><span class="cx">     
</span><span class="cx">     Element* _blockLevelElementForNode(Node*);
</span><span class="cx">     
</span><del>-    void _newParagraphForElement(DOMElement *element, NSString *tag, BOOL flag, BOOL suppressTrailingSpace);
-    void _newLineForElement(DOMElement *element);
-    void _newTabForElement(DOMElement *element);
-    BOOL _addAttachmentForElement(DOMElement *element, NSURL *url, BOOL needsParagraph, BOOL usePlaceholder);
-    void _addQuoteForElement(DOMElement *element, BOOL opening, NSInteger level);
-    void _addValue(NSString *value, DOMElement *element);
</del><ins>+    void _newParagraphForElement(Element&amp;, NSString *tag, BOOL flag, BOOL suppressTrailingSpace);
+    void _newLineForElement(Element&amp;);
+    void _newTabForElement(Element&amp;);
+    BOOL _addAttachmentForElement(Element&amp;, NSURL *url, BOOL needsParagraph, BOOL usePlaceholder);
+    void _addQuoteForElement(Element&amp;, BOOL opening, NSInteger level);
+    void _addValue(NSString *value, Element&amp;);
</ins><span class="cx">     void _fillInBlock(NSTextBlock *block, Element&amp;, PlatformColor *backgroundColor, CGFloat extraMargin, CGFloat extraPadding, BOOL isTable);
</span><ins>+    
+    BOOL _enterElement(Element&amp;, BOOL embedded);
+    BOOL _processElement(Element&amp;, NSInteger depth);
+    void _exitElement(Element&amp;, NSInteger depth, NSUInteger startIndex);
+    
+    void _processHeadElement(Element&amp;);
</ins><span class="cx">     void _processMetaElementWithName(NSString *name, NSString *content);
</span><del>-    void _processHeadElement(DOMElement *element);
-    BOOL _enterElement(DOMElement *element, BOOL embedded);
-    void _addTableForElement(Element *tableElement);
-    void _addTableCellForElement(DOMElement *tableCellElement);
-    BOOL _processElement(DOMElement *element, NSInteger depth);
</del><ins>+    
+    void _addTableForElement(Element* tableElement);
+    void _addTableCellForElement(Element* tableCellElement);
</ins><span class="cx">     void _addMarkersToList(NSTextList *list, NSRange range);
</span><del>-    void _exitElement(DOMElement *element, NSInteger depth, NSUInteger startIndex);
</del><span class="cx">     void _processText(CharacterData&amp;);
</span><span class="cx">     void _adjustTrailingNewline();
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-HTMLConverter::HTMLConverter(DOMRange* domRange)
</del><ins>+HTMLConverter::HTMLConverter(Range&amp; range)
+    : m_range(range)
+    , m_dataSource(nullptr)
</ins><span class="cx"> {
</span><del>-    _domRange = [domRange retain];
</del><span class="cx">     _attrStr = [[NSMutableAttributedString alloc] init];
</span><span class="cx">     _documentAttrs = [[NSMutableDictionary alloc] init];
</span><span class="cx">     _baseURL = nil;
</span><del>-    _document = nil;
-    _dataSource = nullptr;
</del><span class="cx">     _textLists = [[NSMutableArray alloc] init];
</span><span class="cx">     _textBlocks = [[NSMutableArray alloc] init];
</span><span class="cx">     _textTables = [[NSMutableArray alloc] init];
</span><del>-    _textTableFooters = [[NSMutableDictionary alloc] init];
</del><span class="cx">     _textTableSpacings = [[NSMutableArray alloc] init];
</span><span class="cx">     _textTablePaddings = [[NSMutableArray alloc] init];
</span><span class="cx">     _textTableRows = [[NSMutableArray alloc] init];
</span><span class="lines">@@ -544,7 +532,6 @@
</span><span class="cx"> 
</span><span class="cx">     _defaultTabInterval = 36;
</span><span class="cx">     _domRangeStartIndex = 0;
</span><del>-    _errorCode = -1;
</del><span class="cx">     _quoteLevel = 0;
</span><span class="cx">     
</span><span class="cx">     _flags.isSoft = false;
</span><span class="lines">@@ -558,11 +545,9 @@
</span><span class="cx"> {
</span><span class="cx">     [_attrStr release];
</span><span class="cx">     [_documentAttrs release];
</span><del>-    [_domRange release];
</del><span class="cx">     [_textLists release];
</span><span class="cx">     [_textBlocks release];
</span><span class="cx">     [_textTables release];
</span><del>-    [_textTableFooters release];
</del><span class="cx">     [_textTableSpacings release];
</span><span class="cx">     [_textTablePaddings release];
</span><span class="cx">     [_textTableRows release];
</span><span class="lines">@@ -572,6 +557,23 @@
</span><span class="cx">     [_writingDirectionArray release];
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+NSAttributedString *HTMLConverter::convert()
+{
+    Node* commonAncestorContainer = _caches-&gt;cacheAncestorsOfStartToBeConverted(m_range.get());
+    ASSERT(commonAncestorContainer);
+
+    m_dataSource = commonAncestorContainer-&gt;document().frame()-&gt;loader().documentLoader();
+    if (!m_dataSource)
+        return nil;
+    
+    _domRangeStartIndex = 0;
+    _traverseNode(*commonAncestorContainer, 0, false /* embedded */);
+    if (_domRangeStartIndex &gt; 0 &amp;&amp; _domRangeStartIndex &lt;= [_attrStr length])
+        [_attrStr deleteCharactersInRange:NSMakeRange(0, _domRangeStartIndex)];
+    
+    return [[_attrStr retain] autorelease];
+}
+
</ins><span class="cx"> #if !PLATFORM(IOS)
</span><span class="cx"> // Returns the font to be used if the NSFontAttributeName doesn't exist
</span><span class="cx"> static NSFont *WebDefaultFont()
</span><span class="lines">@@ -690,18 +692,6 @@
</span><span class="cx">     return defaultParagraphStyle;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-
-static NSArray *_childrenForNode(DOMNode *node)
-{
-    NSMutableArray *array = [NSMutableArray array];
-    DOMNode *child = [node firstChild];
-    while (child) {
-        [array addObject:child];
-        child = [child nextSibling];
-    }
-    return array;
-}
-
</del><span class="cx"> PassRefPtr&lt;CSSValue&gt; HTMLConverterCaches::computedStylePropertyForElement(Element&amp; element, CSSPropertyID propertyId)
</span><span class="cx"> {
</span><span class="cx">     if (propertyId == CSSPropertyInvalid)
</span><span class="lines">@@ -1134,7 +1124,7 @@
</span><span class="cx"> 
</span><span class="cx"> #define UIFloatIsZero(number) (fabs(number - 0) &lt; FLT_EPSILON)
</span><span class="cx"> 
</span><del>-NSDictionary *HTMLConverter::_computedAttributesForElement(Element&amp; element)
</del><ins>+NSDictionary *HTMLConverter::computedAttributesForElement(Element&amp; element)
</ins><span class="cx"> {
</span><span class="cx">     NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
</span><span class="cx"> #if !PLATFORM(IOS)
</span><span class="lines">@@ -1351,18 +1341,12 @@
</span><span class="cx">     return attrs;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-NSDictionary *HTMLConverter::_attributesForElement(DOMElement *element)
-{
-    if (!element)
-        return [NSDictionary dictionary];
-    return attributesForElement(*core(element));
-}
</del><span class="cx"> 
</span><span class="cx"> NSDictionary* HTMLConverter::attributesForElement(Element&amp; element)
</span><span class="cx"> {
</span><span class="cx">     auto&amp; attributes = m_attributesForElements.add(&amp;element, nullptr).iterator-&gt;value;
</span><span class="cx">     if (!attributes)
</span><del>-        attributes = _computedAttributesForElement(element);
</del><ins>+        attributes = computedAttributesForElement(element);
</ins><span class="cx">     return attributes.get();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1394,7 +1378,7 @@
</span><span class="cx">     return attributes.get();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void HTMLConverter::_newParagraphForElement(DOMElement *element, NSString *tag, BOOL flag, BOOL suppressTrailingSpace)
</del><ins>+void HTMLConverter::_newParagraphForElement(Element&amp; element, NSString *tag, BOOL flag, BOOL suppressTrailingSpace)
</ins><span class="cx"> {
</span><span class="cx">     NSUInteger textLength = [_attrStr length];
</span><span class="cx">     unichar lastChar = (textLength &gt; 0) ? [[_attrStr string] characterAtIndex:textLength - 1] : '\n';
</span><span class="lines">@@ -1407,14 +1391,14 @@
</span><span class="cx">         if (rangeToReplace.location &lt; _domRangeStartIndex)
</span><span class="cx">             _domRangeStartIndex += [string length] - rangeToReplace.length;
</span><span class="cx">         rangeToReplace.length = [string length];
</span><del>-        NSDictionary *attrs = _attributesForElement(element);
</del><ins>+        NSDictionary *attrs = attributesForElement(element);
</ins><span class="cx">         if (rangeToReplace.length &gt; 0)
</span><span class="cx">             [_attrStr setAttributes:attrs range:rangeToReplace];
</span><span class="cx">         _flags.isSoft = YES;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void HTMLConverter::_newLineForElement(DOMElement *element)
</del><ins>+void HTMLConverter::_newLineForElement(Element&amp; element)
</ins><span class="cx"> {
</span><span class="cx">     unichar c = NSLineSeparatorCharacter;
</span><span class="cx">     RetainPtr&lt;NSString&gt; string = adoptNS([[NSString alloc] initWithCharacters:&amp;c length:1]);
</span><span class="lines">@@ -1424,13 +1408,13 @@
</span><span class="cx">     rangeToReplace.length = [string length];
</span><span class="cx">     if (rangeToReplace.location &lt; _domRangeStartIndex)
</span><span class="cx">         _domRangeStartIndex += rangeToReplace.length;
</span><del>-    NSDictionary *attrs = _attributesForElement(element);
</del><ins>+    NSDictionary *attrs = attributesForElement(element);
</ins><span class="cx">     if (rangeToReplace.length &gt; 0)
</span><span class="cx">         [_attrStr setAttributes:attrs range:rangeToReplace];
</span><span class="cx">     _flags.isSoft = YES;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void HTMLConverter::_newTabForElement(DOMElement *element)
</del><ins>+void HTMLConverter::_newTabForElement(Element&amp; element)
</ins><span class="cx"> {
</span><span class="cx">     NSString *string = @&quot;\t&quot;;
</span><span class="cx">     NSUInteger textLength = [_attrStr length];
</span><span class="lines">@@ -1440,7 +1424,7 @@
</span><span class="cx">     rangeToReplace.length = [string length];
</span><span class="cx">     if (rangeToReplace.location &lt; _domRangeStartIndex)
</span><span class="cx">         _domRangeStartIndex += rangeToReplace.length;
</span><del>-    NSDictionary *attrs = _attributesForElement(element);
</del><ins>+    NSDictionary *attrs = attributesForElement(element);
</ins><span class="cx">     if (rangeToReplace.length &gt; 0)
</span><span class="cx">         [_attrStr setAttributes:attrs range:rangeToReplace];
</span><span class="cx">     _flags.isSoft = YES;
</span><span class="lines">@@ -1460,11 +1444,12 @@
</span><span class="cx">     return _WebMessageDocumentClass;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-BOOL HTMLConverter::_addAttachmentForElement(DOMElement *element, NSURL *url, BOOL needsParagraph, BOOL usePlaceholder)
</del><ins>+BOOL HTMLConverter::_addAttachmentForElement(Element&amp; element, NSURL *url, BOOL needsParagraph, BOOL usePlaceholder)
</ins><span class="cx"> {
</span><del>-    BOOL retval = NO, notFound = NO;
</del><ins>+    BOOL retval = NO;
+    BOOL notFound = NO;
</ins><span class="cx">     NSFileWrapper *fileWrapper = nil;
</span><del>-    Frame* frame = core([element ownerDocument])-&gt;frame();
</del><ins>+    Frame* frame = element.document().frame();
</ins><span class="cx">     DocumentLoader *dataSource = frame-&gt;loader().frameHasLoaded() ? frame-&gt;loader().documentLoader() : 0;
</span><span class="cx">     BOOL ignoreOrientation = YES;
</span><span class="cx"> 
</span><span class="lines">@@ -1495,7 +1480,7 @@
</span><span class="cx">             fileWrapper = nil;
</span><span class="cx">     }
</span><span class="cx">     if (!fileWrapper &amp;&amp; !notFound) {
</span><del>-        fileWrapper = fileWrapperForURL(_dataSource, url);
</del><ins>+        fileWrapper = fileWrapperForURL(m_dataSource, url);
</ins><span class="cx">         if (usePlaceholder &amp;&amp; fileWrapper &amp;&amp; [[[[fileWrapper preferredFilename] pathExtension] lowercaseString] hasPrefix:@&quot;htm&quot;])
</span><span class="cx">             notFound = YES;
</span><span class="cx">         if (notFound)
</span><span class="lines">@@ -1550,7 +1535,7 @@
</span><span class="cx">         rangeToReplace.length = [string length];
</span><span class="cx">         if (rangeToReplace.location &lt; _domRangeStartIndex)
</span><span class="cx">             _domRangeStartIndex += rangeToReplace.length;
</span><del>-        attrs = _attributesForElement(element);
</del><ins>+        attrs = attributesForElement(element);
</ins><span class="cx">         if (rangeToReplace.length &gt; 0) {
</span><span class="cx">             [_attrStr setAttributes:attrs range:rangeToReplace];
</span><span class="cx">             rangeToReplace.length = 1;
</span><span class="lines">@@ -1562,7 +1547,7 @@
</span><span class="cx">     return retval;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void HTMLConverter::_addQuoteForElement(DOMElement *element, BOOL opening, NSInteger level)
</del><ins>+void HTMLConverter::_addQuoteForElement(Element&amp; element, BOOL opening, NSInteger level)
</ins><span class="cx"> {
</span><span class="cx">     unichar c = ((level % 2) == 0) ? (opening ? 0x201c : 0x201d) : (opening ? 0x2018 : 0x2019);
</span><span class="cx">     RetainPtr&lt;NSString&gt; string = adoptNS([[NSString alloc] initWithCharacters:&amp;c length:1]);
</span><span class="lines">@@ -1572,13 +1557,13 @@
</span><span class="cx">     rangeToReplace.length = [string length];
</span><span class="cx">     if (rangeToReplace.location &lt; _domRangeStartIndex)
</span><span class="cx">         _domRangeStartIndex += rangeToReplace.length;
</span><del>-    RetainPtr&lt;NSDictionary&gt; attrs = _attributesForElement(element);
</del><ins>+    RetainPtr&lt;NSDictionary&gt; attrs = attributesForElement(element);
</ins><span class="cx">     if (rangeToReplace.length &gt; 0)
</span><span class="cx">         [_attrStr setAttributes:attrs.get() range:rangeToReplace];
</span><span class="cx">     _flags.isSoft = NO;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void HTMLConverter::_addValue(NSString *value, DOMElement *element)
</del><ins>+void HTMLConverter::_addValue(NSString *value, Element&amp; element)
</ins><span class="cx"> {
</span><span class="cx">     NSUInteger textLength = [_attrStr length];
</span><span class="cx">     NSUInteger valueLength = [value length];
</span><span class="lines">@@ -1588,7 +1573,7 @@
</span><span class="cx">         rangeToReplace.length = valueLength;
</span><span class="cx">         if (rangeToReplace.location &lt; _domRangeStartIndex)
</span><span class="cx">             _domRangeStartIndex += rangeToReplace.length;
</span><del>-        RetainPtr&lt;NSDictionary&gt; attrs = _attributesForElement(element);
</del><ins>+        RetainPtr&lt;NSDictionary&gt; attrs = attributesForElement(element);
</ins><span class="cx">         if (rangeToReplace.length &gt; 0)
</span><span class="cx">             [_attrStr setAttributes:attrs.get() range:rangeToReplace];
</span><span class="cx">         _flags.isSoft = NO;
</span><span class="lines">@@ -1806,39 +1791,28 @@
</span><span class="cx">         [_documentAttrs setObject:content forKey:key];
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void HTMLConverter::_processHeadElement(DOMElement *element)
</del><ins>+void HTMLConverter::_processHeadElement(Element&amp; element)
</ins><span class="cx"> {
</span><del>-    // ??? should gather data from other sources e.g. Word, but for that we would need to be able to get comments from DOM
-    NSArray *childNodes = _childrenForNode(element);
-    NSUInteger count = [childNodes count];
-    for (NSUInteger i = 0; i &lt; count; i++) {
-        DOMNode *node = [childNodes objectAtIndex:i];
-        unsigned short nodeType = [node nodeType];
-        if (DOM_ELEMENT_NODE == nodeType) {
-            DOMElement *element = (DOMElement *)node;
-            NSString *tag = [element tagName];
-            if ([@&quot;META&quot; isEqualToString:tag] &amp;&amp; [element respondsToSelector:@selector(name)] &amp;&amp; [element respondsToSelector:@selector(content)]) {
-                NSString *name = [(DOMHTMLMetaElement *)element name];
-                NSString *content = [(DOMHTMLMetaElement *)element content];
-                if (name &amp;&amp; content)
-                    _processMetaElementWithName(name, content);
-            }
-        }
</del><ins>+    // FIXME: Should gather data from other sources e.g. Word, but for that we would need to be able to get comments from DOM
+    
+    for (HTMLMetaElement* child = Traversal&lt;HTMLMetaElement&gt;::firstChild(&amp;element); child; child = Traversal&lt;HTMLMetaElement&gt;::nextSibling(child)) {
+        NSString *name = child-&gt;name();
+        NSString *content = child-&gt;content();
+        if (name &amp;&amp; content)
+            _processMetaElementWithName(name, content);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-BOOL HTMLConverter::_enterElement(DOMElement *element, BOOL embedded)
</del><ins>+BOOL HTMLConverter::_enterElement(Element&amp; element, BOOL embedded)
</ins><span class="cx"> {
</span><del>-    ASSERT(element);
-    Element&amp; coreElement = *core(element);
-    String displayValue = _caches-&gt;propertyValueForNode(coreElement, CSSPropertyDisplay);
</del><ins>+    String displayValue = _caches-&gt;propertyValueForNode(element, CSSPropertyDisplay);
</ins><span class="cx"> 
</span><del>-    if (coreElement.hasTagName(headTag) &amp;&amp; !embedded)
</del><ins>+    if (element.hasTagName(headTag) &amp;&amp; !embedded)
</ins><span class="cx">         _processHeadElement(element);
</span><span class="cx">     else if (!displayValue.length() || !(displayValue == &quot;none&quot; || displayValue == &quot;table-column&quot; || displayValue == &quot;table-column-group&quot;)) {
</span><del>-        if (_caches-&gt;isBlockElement(coreElement) &amp;&amp; !coreElement.hasTagName(brTag) &amp;&amp; !(displayValue == &quot;table-cell&quot; &amp;&amp; [_textTables count] == 0)
-            &amp;&amp; !([_textLists count] &gt; 0 &amp;&amp; displayValue == &quot;block&quot; &amp;&amp; !coreElement.hasTagName(liTag) &amp;&amp; !coreElement.hasTagName(ulTag) &amp;&amp; !coreElement.hasTagName(olTag)))
-            _newParagraphForElement(element, [element tagName], NO, YES);
</del><ins>+        if (_caches-&gt;isBlockElement(element) &amp;&amp; !element.hasTagName(brTag) &amp;&amp; !(displayValue == &quot;table-cell&quot; &amp;&amp; [_textTables count] == 0)
+            &amp;&amp; !([_textLists count] &gt; 0 &amp;&amp; displayValue == &quot;block&quot; &amp;&amp; !element.hasTagName(liTag) &amp;&amp; !element.hasTagName(ulTag) &amp;&amp; !element.hasTagName(olTag)))
+            _newParagraphForElement(element, element.tagName(), NO, YES);
</ins><span class="cx">         return YES;
</span><span class="cx">     }
</span><span class="cx">     return NO;
</span><span class="lines">@@ -1884,7 +1858,7 @@
</span><span class="cx">     [_textTableRowArrays addObject:[NSMutableArray array]];
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void HTMLConverter::_addTableCellForElement(DOMElement *tableCellElement)
</del><ins>+void HTMLConverter::_addTableCellForElement(Element* element)
</ins><span class="cx"> {
</span><span class="cx">     NSTextTable *table = [_textTables lastObject];
</span><span class="cx">     NSInteger rowNumber = [[_textTableRows lastObject] integerValue];
</span><span class="lines">@@ -1902,25 +1876,26 @@
</span><span class="cx">         if (columnNumber &gt;= [previousBlock startingColumn] &amp;&amp; columnNumber &lt; [previousBlock startingColumn] + [previousBlock columnSpan])
</span><span class="cx">             columnNumber = [previousBlock startingColumn] + [previousBlock columnSpan];
</span><span class="cx">     }
</span><del>-    if (tableCellElement) {
-        if ([tableCellElement respondsToSelector:@selector(rowSpan)]) {
-            rowSpan = [(DOMHTMLTableCellElement *)tableCellElement rowSpan];
</del><ins>+    
+    RetainPtr&lt;NSTextTableBlock&gt; block;
+    
+    if (element) {
+        if (isHTMLTableCellElement(*element)) {
+            HTMLTableCellElement&amp; tableCellElement = toHTMLTableCellElement(*element);
+            
+            rowSpan = tableCellElement.rowSpan();
</ins><span class="cx">             if (rowSpan &lt; 1)
</span><span class="cx">                 rowSpan = 1;
</span><del>-        }
-        if ([tableCellElement respondsToSelector:@selector(colSpan)]) {
-            colSpan = [(DOMHTMLTableCellElement *)tableCellElement colSpan];
</del><ins>+            colSpan = tableCellElement.colSpan();
</ins><span class="cx">             if (colSpan &lt; 1)
</span><span class="cx">                 colSpan = 1;
</span><span class="cx">         }
</span><del>-    }
-    RetainPtr&lt;NSTextTableBlock&gt; block = adoptNS([[PlatformNSTextTableBlock alloc] initWithTable:table startingRow:rowNumber rowSpan:rowSpan startingColumn:columnNumber columnSpan:colSpan]);
-    if (tableCellElement) {
-        Element&amp; coreTableCellElement = *core(tableCellElement);
</del><span class="cx">         
</span><del>-        String verticalAlign = _caches-&gt;propertyValueForNode(coreTableCellElement, CSSPropertyVerticalAlign);
</del><ins>+        block = adoptNS([[PlatformNSTextTableBlock alloc] initWithTable:table startingRow:rowNumber rowSpan:rowSpan startingColumn:columnNumber columnSpan:colSpan]);
</ins><span class="cx">         
</span><del>-        _fillInBlock(block.get(), coreTableCellElement, color, cellSpacingVal / 2, 0, NO);
</del><ins>+        String verticalAlign = _caches-&gt;propertyValueForNode(*element, CSSPropertyVerticalAlign);
+        
+        _fillInBlock(block.get(), *element, color, cellSpacingVal / 2, 0, NO);
</ins><span class="cx">         if (verticalAlign == &quot;middle&quot;)
</span><span class="cx">             [block setVerticalAlignment:NSTextBlockMiddleAlignment];
</span><span class="cx">         else if (verticalAlign == &quot;bottom&quot;)
</span><span class="lines">@@ -1929,63 +1904,65 @@
</span><span class="cx">             [block setVerticalAlignment:NSTextBlockBaselineAlignment];
</span><span class="cx">         else if (verticalAlign == &quot;top&quot;)
</span><span class="cx">             [block setVerticalAlignment:NSTextBlockTopAlignment];
</span><ins>+    } else {
+        block = adoptNS([[PlatformNSTextTableBlock alloc] initWithTable:table startingRow:rowNumber rowSpan:rowSpan startingColumn:columnNumber columnSpan:colSpan]);
</ins><span class="cx">     }
</span><ins>+    
</ins><span class="cx">     [_textBlocks addObject:block.get()];
</span><span class="cx">     [rowArray addObject:block.get()];
</span><span class="cx">     [rowArray sortUsingFunction:_colCompare context:NULL];
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-BOOL HTMLConverter::_processElement(DOMElement *element, NSInteger depth)
</del><ins>+BOOL HTMLConverter::_processElement(Element&amp; element, NSInteger depth)
</ins><span class="cx"> {
</span><del>-    if (!element)
-        return NO;
</del><span class="cx">     BOOL retval = YES;
</span><del>-    Element&amp; coreElement = *core(element);
-    BOOL isBlockLevel = _caches-&gt;isBlockElement(coreElement);
-    String displayValue = _caches-&gt;propertyValueForNode(coreElement, CSSPropertyDisplay);
</del><ins>+    BOOL isBlockLevel = _caches-&gt;isBlockElement(element);
+    String displayValue = _caches-&gt;propertyValueForNode(element, CSSPropertyDisplay);
</ins><span class="cx">     if (isBlockLevel)
</span><span class="cx">         [_writingDirectionArray removeAllObjects];
</span><span class="cx">     else {
</span><del>-        String bidi = _caches-&gt;propertyValueForNode(coreElement, CSSPropertyUnicodeBidi);
</del><ins>+        String bidi = _caches-&gt;propertyValueForNode(element, CSSPropertyUnicodeBidi);
</ins><span class="cx">         if (bidi == &quot;embed&quot;) {
</span><span class="cx">             NSUInteger val = NSTextWritingDirectionEmbedding;
</span><del>-            if (_caches-&gt;propertyValueForNode(coreElement, CSSPropertyDirection) == &quot;rtl&quot;)
</del><ins>+            if (_caches-&gt;propertyValueForNode(element, CSSPropertyDirection) == &quot;rtl&quot;)
</ins><span class="cx">                 val |= NSWritingDirectionRightToLeft;
</span><span class="cx">             [_writingDirectionArray addObject:[NSNumber numberWithUnsignedInteger:val]];
</span><span class="cx">         } else if (bidi == &quot;bidi-override&quot;) {
</span><span class="cx">             NSUInteger val = NSTextWritingDirectionOverride;
</span><del>-            if (_caches-&gt;propertyValueForNode(coreElement, CSSPropertyDirection) == &quot;rtl&quot;)
</del><ins>+            if (_caches-&gt;propertyValueForNode(element, CSSPropertyDirection) == &quot;rtl&quot;)
</ins><span class="cx">                 val |= NSWritingDirectionRightToLeft;
</span><span class="cx">             [_writingDirectionArray addObject:[NSNumber numberWithUnsignedInteger:val]];
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     if (displayValue == &quot;table&quot; || ([_textTables count] == 0 &amp;&amp; displayValue == &quot;table-row-group&quot;)) {
</span><del>-        Element* tableElement = &amp;coreElement;
</del><ins>+        Element* tableElement = &amp;element;
</ins><span class="cx">         if (displayValue == &quot;table-row-group&quot;) {
</span><span class="cx">             // If we are starting in medias res, the first thing we see may be the tbody, so go up to the table
</span><del>-            tableElement = _blockLevelElementForNode(coreElement.parentNode());
</del><ins>+            tableElement = _blockLevelElementForNode(element.parentNode());
</ins><span class="cx">             if (!tableElement || _caches-&gt;propertyValueForNode(*tableElement, CSSPropertyDisplay) != &quot;table&quot;)
</span><del>-                tableElement = &amp;coreElement;
</del><ins>+                tableElement = &amp;element;
</ins><span class="cx">         }
</span><span class="cx">         while ([_textTables count] &gt; [_textBlocks count])
</span><span class="cx">             _addTableCellForElement(nil);
</span><span class="cx">         _addTableForElement(tableElement);
</span><span class="cx">     } else if (displayValue == &quot;table-footer-group&quot; &amp;&amp; [_textTables count] &gt; 0) {
</span><del>-        [_textTableFooters setObject:element forKey:[NSValue valueWithNonretainedObject:[_textTables lastObject]]];
</del><ins>+        m_textTableFooters.add([_textTables lastObject], &amp;element);
</ins><span class="cx">         retval = NO;
</span><span class="cx">     } else if (displayValue == &quot;table-row&quot; &amp;&amp; [_textTables count] &gt; 0) {
</span><del>-        PlatformColor *color = _colorForElement(coreElement, CSSPropertyBackgroundColor);
-        if (!color) color = [PlatformColorClass clearColor];
</del><ins>+        PlatformColor *color = _colorForElement(element, CSSPropertyBackgroundColor);
+        if (!color)
+            color = [PlatformColorClass clearColor];
</ins><span class="cx">         [_textTableRowBackgroundColors addObject:color];
</span><span class="cx">     } else if (displayValue == &quot;table-cell&quot;) {
</span><span class="cx">         while ([_textTables count] &lt; [_textBlocks count] + 1)
</span><span class="cx">             _addTableForElement(nil);
</span><del>-        _addTableCellForElement(element);
-    } else if (coreElement.hasTagName(imgTag)) {
-        NSString *urlString = [element getAttribute:@&quot;src&quot;];
</del><ins>+        _addTableCellForElement(&amp;element);
+    } else if (element.hasTagName(imgTag)) {
+        NSString *urlString = element.getAttribute(srcAttr);
</ins><span class="cx">         if (urlString &amp;&amp; [urlString length] &gt; 0) {
</span><del>-            NSURL *url = core([element ownerDocument])-&gt;completeURL(stripLeadingAndTrailingHTMLSpaces(urlString));
-            if (!url) url = [NSURL _web_URLWithString:[urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] relativeToURL:_baseURL];
</del><ins>+            NSURL *url = element.document().completeURL(stripLeadingAndTrailingHTMLSpaces(urlString));
+            if (!url)
+                url = [NSURL _web_URLWithString:[urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] relativeToURL:_baseURL];
</ins><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">             BOOL usePlaceholderImage = NO;
</span><span class="cx"> #else
</span><span class="lines">@@ -1995,35 +1972,35 @@
</span><span class="cx">                 _addAttachmentForElement(element, url, isBlockLevel, usePlaceholderImage);
</span><span class="cx">         }
</span><span class="cx">         retval = NO;
</span><del>-    } else if (coreElement.hasTagName(objectTag)) {
-        NSString *baseString = [element getAttribute:@&quot;codebase&quot;];
-        NSString *urlString = [element getAttribute:@&quot;data&quot;];
-        NSString *declareString = [element getAttribute:@&quot;declare&quot;];
</del><ins>+    } else if (element.hasTagName(objectTag)) {
+        NSString *baseString = element.getAttribute(codebaseAttr);
+        NSString *urlString = element.getAttribute(dataAttr);
+        NSString *declareString = element.getAttribute(declareAttr);
</ins><span class="cx">         if (urlString &amp;&amp; [urlString length] &gt; 0 &amp;&amp; ![@&quot;true&quot; isEqualToString:declareString]) {
</span><span class="cx">             NSURL *baseURL = nil;
</span><span class="cx">             NSURL *url = nil;
</span><span class="cx">             if (baseString &amp;&amp; [baseString length] &gt; 0) {
</span><del>-                baseURL = core([element ownerDocument])-&gt;completeURL(stripLeadingAndTrailingHTMLSpaces(baseString));
</del><ins>+                baseURL = element.document().completeURL(stripLeadingAndTrailingHTMLSpaces(baseString));
</ins><span class="cx">                 if (!baseURL)
</span><span class="cx">                     baseURL = [NSURL _web_URLWithString:[baseString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] relativeToURL:_baseURL];
</span><span class="cx">             }
</span><span class="cx">             if (baseURL)
</span><span class="cx">                 url = [NSURL _web_URLWithString:[urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] relativeToURL:baseURL];
</span><span class="cx">             if (!url)
</span><del>-                url = core([element ownerDocument])-&gt;completeURL(stripLeadingAndTrailingHTMLSpaces(urlString));
</del><ins>+                url = element.document().completeURL(stripLeadingAndTrailingHTMLSpaces(urlString));
</ins><span class="cx">             if (!url)
</span><span class="cx">                 url = [NSURL _web_URLWithString:[urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] relativeToURL:_baseURL];
</span><span class="cx">             if (url)
</span><span class="cx">                 retval = !_addAttachmentForElement(element, url, isBlockLevel, NO);
</span><span class="cx">         }
</span><del>-    } else if (coreElement.hasTagName(frameTag) || coreElement.hasTagName(iframeTag)) {
-        if (Document* contentDocument = toHTMLFrameElementBase(coreElement).contentDocument()) {
-            _traverseNode(contentDocument, depth + 1, true /* embedded */);
</del><ins>+    } else if (element.hasTagName(frameTag) || element.hasTagName(iframeTag)) {
+        if (Document* contentDocument = toHTMLFrameElementBase(element).contentDocument()) {
+            _traverseNode(*contentDocument, depth + 1, true /* embedded */);
</ins><span class="cx">             retval = NO;
</span><span class="cx">         }
</span><del>-    } else if (coreElement.hasTagName(brTag)) {
-        Element* blockElement = _blockLevelElementForNode(coreElement.parentNode());
-        NSString *breakClass = [element getAttribute:@&quot;class&quot;];
</del><ins>+    } else if (element.hasTagName(brTag)) {
+        Element* blockElement = _blockLevelElementForNode(element.parentNode());
+        NSString *breakClass = element.getAttribute(classAttr);
</ins><span class="cx">         NSString *blockTag = blockElement ? (NSString *)blockElement-&gt;tagName() : nil;
</span><span class="cx">         BOOL isExtraBreak = [@&quot;Apple-interchange-newline&quot; isEqualToString:breakClass];
</span><span class="cx">         BOOL blockElementIsParagraph = ([@&quot;P&quot; isEqualToString:blockTag] || [@&quot;LI&quot; isEqualToString:blockTag] || ([blockTag hasPrefix:@&quot;H&quot;] &amp;&amp; 2 == [blockTag length]));
</span><span class="lines">@@ -2033,37 +2010,41 @@
</span><span class="cx">             if (blockElement &amp;&amp; blockElementIsParagraph)
</span><span class="cx">                 _newLineForElement(element);
</span><span class="cx">             else
</span><del>-                _newParagraphForElement(element, [element tagName], YES, NO);
</del><ins>+                _newParagraphForElement(element, element.tagName(), YES, NO);
</ins><span class="cx">         }
</span><del>-    } else if (coreElement.hasTagName(ulTag)) {
</del><ins>+    } else if (element.hasTagName(ulTag)) {
</ins><span class="cx">         RetainPtr&lt;NSTextList&gt; list;
</span><del>-        String listStyleType = _caches-&gt;propertyValueForNode(coreElement, CSSPropertyListStyleType);
</del><ins>+        String listStyleType = _caches-&gt;propertyValueForNode(element, CSSPropertyListStyleType);
</ins><span class="cx">         if (!listStyleType.length())
</span><span class="cx">             listStyleType = @&quot;disc&quot;;
</span><span class="cx">         list = adoptNS([[PlatformNSTextList alloc] initWithMarkerFormat:String(&quot;{&quot; + listStyleType + &quot;}&quot;) options:0]);
</span><span class="cx">         [_textLists addObject:list.get()];
</span><del>-    } else if (coreElement.hasTagName(olTag)) {
</del><ins>+    } else if (element.hasTagName(olTag)) {
</ins><span class="cx">         RetainPtr&lt;NSTextList&gt; list;
</span><del>-        String listStyleType = _caches-&gt;propertyValueForNode(coreElement, CSSPropertyListStyleType);
</del><ins>+        String listStyleType = _caches-&gt;propertyValueForNode(element, CSSPropertyListStyleType);
</ins><span class="cx">         if (!listStyleType.length())
</span><span class="cx">             listStyleType = &quot;decimal&quot;;
</span><span class="cx">         list = adoptNS([[PlatformNSTextList alloc] initWithMarkerFormat:String(&quot;{&quot; + listStyleType + &quot;}&quot;) options:0]);
</span><del>-        if ([element respondsToSelector:@selector(start)]) {
-            NSInteger startingItemNumber = [(DOMHTMLOListElement *)element start];
</del><ins>+        if (isHTMLOListElement(element)) {
+            NSInteger startingItemNumber = toHTMLOListElement(element).start();;
</ins><span class="cx">             [list setStartingItemNumber:startingItemNumber];
</span><span class="cx">         }
</span><span class="cx">         [_textLists addObject:list.get()];
</span><del>-    } else if (coreElement.hasTagName(qTag)) {
</del><ins>+    } else if (element.hasTagName(qTag)) {
</ins><span class="cx">         _addQuoteForElement(element, YES, _quoteLevel++);
</span><del>-    } else if (coreElement.hasTagName(inputTag)) {
-        if ([element respondsToSelector:@selector(type)] &amp;&amp; [element respondsToSelector:@selector(value)] &amp;&amp; [@&quot;text&quot; compare:[(DOMHTMLInputElement *)element type] options:NSCaseInsensitiveSearch] == NSOrderedSame) {
-            NSString *value = [(DOMHTMLInputElement *)element value];
-            if (value &amp;&amp; [value length] &gt; 0)
-                _addValue(value, element);
</del><ins>+    } else if (element.hasTagName(inputTag)) {
+        if (isHTMLInputElement(element)) {
+            HTMLInputElement&amp; inputElement = toHTMLInputElement(element);
+            if (inputElement.type() == &quot;text&quot;) {
+                NSString *value = inputElement.value();
+                if (value &amp;&amp; [value length] &gt; 0)
+                    _addValue(value, element);
+            }
</ins><span class="cx">         }
</span><del>-    } else if (coreElement.hasTagName(textareaTag)) {
-        if ([element respondsToSelector:@selector(value)]) {
-            NSString *value = [(DOMHTMLTextAreaElement *)element value];
</del><ins>+    } else if (element.hasTagName(textareaTag)) {
+        if (isHTMLTextAreaElement(element)) {
+            HTMLTextAreaElement&amp; textAreaElement = toHTMLTextAreaElement(element);
+            NSString *value = textAreaElement.value();
</ins><span class="cx">             if (value &amp;&amp; [value length] &gt; 0)
</span><span class="cx">                 _addValue(value, element);
</span><span class="cx">         }
</span><span class="lines">@@ -2118,7 +2099,8 @@
</span><span class="cx">                     [_attrStr setAttributes:attrsToInsert range:NSMakeRange(paragraphRange.location, insertLength)];
</span><span class="cx">                     range.length += insertLength;
</span><span class="cx">                     paragraphRange.length += insertLength;
</span><del>-                    if (paragraphRange.location &lt; _domRangeStartIndex) _domRangeStartIndex += insertLength;
</del><ins>+                    if (paragraphRange.location &lt; _domRangeStartIndex)
+                        _domRangeStartIndex += insertLength;
</ins><span class="cx">                     
</span><span class="cx">                     newStyle = [paragraphStyle mutableCopy];
</span><span class="cx">                     listLocation = (listIndex + 1) * 36;
</span><span class="lines">@@ -2159,47 +2141,45 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void HTMLConverter::_exitElement(DOMElement *element, NSInteger depth, NSUInteger startIndex)
</del><ins>+void HTMLConverter::_exitElement(Element&amp; element, NSInteger depth, NSUInteger startIndex)
</ins><span class="cx"> {
</span><del>-    ASSERT(element);
-    Element&amp; coreElement = *core(element);
-    String displayValue = _caches-&gt;propertyValueForNode(coreElement, CSSPropertyDisplay);
</del><ins>+    String displayValue = _caches-&gt;propertyValueForNode(element, CSSPropertyDisplay);
</ins><span class="cx">     NSRange range = NSMakeRange(startIndex, [_attrStr length] - startIndex);
</span><del>-    if (range.length &gt; 0 &amp;&amp; coreElement.hasTagName(aTag)) {
-        NSString *urlString = [element getAttribute:@&quot;href&quot;];
</del><ins>+    if (range.length &gt; 0 &amp;&amp; element.hasTagName(aTag)) {
+        NSString *urlString = element.getAttribute(hrefAttr);
</ins><span class="cx">         NSString *strippedString = [urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
</span><span class="cx">         if (urlString &amp;&amp; [urlString length] &gt; 0 &amp;&amp; strippedString &amp;&amp; [strippedString length] &gt; 0 &amp;&amp; ![strippedString hasPrefix:@&quot;#&quot;]) {
</span><del>-            NSURL *url = core([element ownerDocument])-&gt;completeURL(stripLeadingAndTrailingHTMLSpaces(urlString));
</del><ins>+            NSURL *url = element.document().completeURL(stripLeadingAndTrailingHTMLSpaces(urlString));
</ins><span class="cx">             if (!url)
</span><del>-                url = core([element ownerDocument])-&gt;completeURL(stripLeadingAndTrailingHTMLSpaces(strippedString));
</del><ins>+                url = element.document().completeURL(stripLeadingAndTrailingHTMLSpaces(strippedString));
</ins><span class="cx">             if (!url)
</span><span class="cx">                 url = [NSURL _web_URLWithString:strippedString relativeToURL:_baseURL];
</span><span class="cx">             [_attrStr addAttribute:NSLinkAttributeName value:url ? (id)url : (id)urlString range:range];
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    if (!_flags.reachedEnd &amp;&amp; _caches-&gt;isBlockElement(coreElement)) {
</del><ins>+    if (!_flags.reachedEnd &amp;&amp; _caches-&gt;isBlockElement(element)) {
</ins><span class="cx">         [_writingDirectionArray removeAllObjects];
</span><span class="cx">         if (displayValue == &quot;table-cell&quot; &amp;&amp; [_textBlocks count] == 0) {
</span><span class="cx">             _newTabForElement(element);
</span><del>-        } else if ([_textLists count] &gt; 0 &amp;&amp; displayValue == &quot;block&quot; &amp;&amp; !coreElement.hasTagName(liTag) &amp;&amp; !coreElement.hasTagName(ulTag) &amp;&amp; !coreElement.hasTagName(olTag)) {
</del><ins>+        } else if ([_textLists count] &gt; 0 &amp;&amp; displayValue == &quot;block&quot; &amp;&amp; !element.hasTagName(liTag) &amp;&amp; !element.hasTagName(ulTag) &amp;&amp; !element.hasTagName(olTag)) {
</ins><span class="cx">             _newLineForElement(element);
</span><span class="cx">         } else {
</span><del>-            _newParagraphForElement(element, [element tagName], (range.length == 0), YES);
</del><ins>+            _newParagraphForElement(element, element.tagName(), (range.length == 0), YES);
</ins><span class="cx">         }
</span><span class="cx">     } else if ([_writingDirectionArray count] &gt; 0) {
</span><del>-        String bidi = _caches-&gt;propertyValueForNode(coreElement, CSSPropertyUnicodeBidi);
</del><ins>+        String bidi = _caches-&gt;propertyValueForNode(element, CSSPropertyUnicodeBidi);
</ins><span class="cx">         if (bidi == &quot;embed&quot; || bidi == &quot;bidi-override&quot;)
</span><span class="cx">             [_writingDirectionArray removeLastObject];
</span><span class="cx">     }
</span><span class="cx">     range = NSMakeRange(startIndex, [_attrStr length] - startIndex);
</span><span class="cx">     if (displayValue == &quot;table&quot; &amp;&amp; [_textTables count] &gt; 0) {
</span><del>-        NSValue *key = [NSValue valueWithNonretainedObject:[_textTables lastObject]];
-        DOMNode *footer = [_textTableFooters objectForKey:key];
</del><ins>+        NSTextTable *key = [_textTables lastObject];
+        Element* footer = m_textTableFooters.get(key);
</ins><span class="cx">         while ([_textTables count] &lt; [_textBlocks count] + 1)
</span><span class="cx">             [_textBlocks removeLastObject];
</span><span class="cx">         if (footer) {
</span><del>-            _traverseFooterNode(footer, depth + 1);
-            [_textTableFooters removeObjectForKey:key];
</del><ins>+            _traverseFooterNode(*footer, depth + 1);
+            m_textTableFooters.remove(key);
</ins><span class="cx">         }
</span><span class="cx">         [_textTables removeLastObject];
</span><span class="cx">         [_textTableSpacings removeLastObject];
</span><span class="lines">@@ -2248,14 +2228,14 @@
</span><span class="cx">             [_textTableRowArrays removeLastObject];
</span><span class="cx">         }
</span><span class="cx">         [_textBlocks removeLastObject];
</span><del>-    } else if ((coreElement.hasTagName(ulTag) || coreElement.hasTagName(olTag)) &amp;&amp; [_textLists count] &gt; 0) {
</del><ins>+    } else if ((element.hasTagName(ulTag) || element.hasTagName(olTag)) &amp;&amp; [_textLists count] &gt; 0) {
</ins><span class="cx">         NSTextList *list = [_textLists lastObject];
</span><span class="cx">         _addMarkersToList(list, range);
</span><span class="cx">         [_textLists removeLastObject];
</span><del>-    } else if (coreElement.hasTagName(qTag)) {
</del><ins>+    } else if (element.hasTagName(qTag)) {
</ins><span class="cx">         _addQuoteForElement(element, NO, --_quoteLevel);
</span><del>-    } else if (coreElement.hasTagName(spanTag)) {
-        NSString *className = [element getAttribute:@&quot;class&quot;];
</del><ins>+    } else if (element.hasTagName(spanTag)) {
+        NSString *className = element.getAttribute(classAttr);
</ins><span class="cx">         NSMutableString *mutableString;
</span><span class="cx">         NSUInteger i, count = 0;
</span><span class="cx">         unichar c;
</span><span class="lines">@@ -2306,19 +2286,17 @@
</span><span class="cx">     String originalString = characterData.data();
</span><span class="cx">     unsigned startOffset = 0;
</span><span class="cx">     unsigned endOffset = originalString.length();
</span><del>-    if (_domRange) {
-        if (&amp;characterData == core([_domRange startContainer])) {
-            startOffset = (NSUInteger)[_domRange startOffset];
-            _domRangeStartIndex = [_attrStr length];
-            _flags.reachedStart = YES;
-        }
-        if (&amp;characterData == core([_domRange endContainer])) {
-            endOffset = (NSUInteger)[_domRange endOffset];
-            _flags.reachedEnd = YES;
-        }
-        if ((startOffset &gt; 0 || endOffset &lt; originalString.length()) &amp;&amp; endOffset &gt;= startOffset)
-            originalString = originalString.substring(startOffset, endOffset - startOffset);
</del><ins>+    if (&amp;characterData == m_range-&gt;startContainer()) {
+        startOffset = m_range-&gt;startOffset();
+        _domRangeStartIndex = [_attrStr length];
+        _flags.reachedStart = YES;
</ins><span class="cx">     }
</span><ins>+    if (&amp;characterData == m_range-&gt;endContainer()) {
+        endOffset = m_range-&gt;endOffset();
+        _flags.reachedEnd = YES;
+    }
+    if ((startOffset &gt; 0 || endOffset &lt; originalString.length()) &amp;&amp; endOffset &gt;= startOffset)
+        originalString = originalString.substring(startOffset, endOffset - startOffset);
</ins><span class="cx">     String outputString = originalString;
</span><span class="cx"> 
</span><span class="cx">     // FIXME: Use RenderText's content instead.
</span><span class="lines">@@ -2373,53 +2351,51 @@
</span><span class="cx">         CFRelease(mutstr);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void HTMLConverter::_traverseNode(Node* node, unsigned depth, bool embedded)
</del><ins>+void HTMLConverter::_traverseNode(Node&amp; node, unsigned depth, bool embedded)
</ins><span class="cx"> {
</span><del>-    if (!node || _flags.reachedEnd)
</del><ins>+    if (_flags.reachedEnd)
</ins><span class="cx">         return;
</span><del>-    if (_domRange &amp;&amp; !_flags.reachedStart &amp;&amp; !_caches-&gt;isAncestorsOfStartToBeConverted(node))
</del><ins>+    if (!_flags.reachedStart &amp;&amp; !_caches-&gt;isAncestorsOfStartToBeConverted(node))
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     unsigned startOffset = 0;
</span><span class="cx">     unsigned endOffset = UINT_MAX;
</span><span class="cx">     bool isStart = false;
</span><span class="cx">     bool isEnd = false;
</span><del>-    if (_domRange) {
-        if (node == core([_domRange startContainer])) {
-            startOffset = (NSUInteger)[_domRange startOffset];
-            isStart = true;
-            _flags.reachedStart = YES;
-        }
-        if (node == core([_domRange endContainer])) {
-            endOffset = (NSUInteger)[_domRange endOffset];
-            isEnd = true;
-        }
</del><ins>+    if (&amp;node == m_range-&gt;startContainer()) {
+        startOffset = m_range-&gt;startOffset();
+        isStart = true;
+        _flags.reachedStart = YES;
</ins><span class="cx">     }
</span><ins>+    if (&amp;node == m_range-&gt;endContainer()) {
+        endOffset = m_range-&gt;endOffset();
+        isEnd = true;
+    }
</ins><span class="cx">     
</span><del>-    if (node-&gt;isDocumentNode() || node-&gt;isDocumentFragment()) {
-        Node* child = node-&gt;firstChild();
</del><ins>+    if (node.isDocumentNode() || node.isDocumentFragment()) {
+        Node* child = node.firstChild();
</ins><span class="cx">         for (NSUInteger i = 0; child; i++) {
</span><span class="cx">             if (isStart &amp;&amp; i == startOffset)
</span><span class="cx">                 _domRangeStartIndex = [_attrStr length];
</span><span class="cx">             if ((!isStart || startOffset &lt;= i) &amp;&amp; (!isEnd || endOffset &gt; i))
</span><del>-                _traverseNode(child, depth + 1, embedded);
</del><ins>+                _traverseNode(*child, depth + 1, embedded);
</ins><span class="cx">             if (isEnd &amp;&amp; i + 1 &gt;= endOffset)
</span><span class="cx">                 _flags.reachedEnd = YES;
</span><span class="cx">             if (_flags.reachedEnd)
</span><span class="cx">                 break;
</span><span class="cx">             child = child-&gt;nextSibling();
</span><span class="cx">         }
</span><del>-    } else if (node-&gt;isElementNode()) {
-        DOMElement* element = kit(toElement(node));
</del><ins>+    } else if (node.isElementNode()) {
+        Element&amp; element = toElement(node);
</ins><span class="cx">         if (_enterElement(element, embedded)) {
</span><span class="cx">             NSUInteger startIndex = [_attrStr length];
</span><span class="cx">             if (_processElement(element, depth)) {
</span><del>-                Node* child = node-&gt;firstChild();
</del><ins>+                Node* child = node.firstChild();
</ins><span class="cx">                 for (NSUInteger i = 0; child; i++) {
</span><span class="cx">                     if (isStart &amp;&amp; i == startOffset)
</span><span class="cx">                         _domRangeStartIndex = [_attrStr length];
</span><span class="cx">                     if ((!isStart || startOffset &lt;= i) &amp;&amp; (!isEnd || endOffset &gt; i))
</span><del>-                        _traverseNode(child, depth + 1, embedded);
</del><ins>+                        _traverseNode(*child, depth + 1, embedded);
</ins><span class="cx">                     if (isEnd &amp;&amp; i + 1 &gt;= endOffset)
</span><span class="cx">                         _flags.reachedEnd = YES;
</span><span class="cx">                     if (_flags.reachedEnd)
</span><span class="lines">@@ -2429,46 +2405,43 @@
</span><span class="cx">                 _exitElement(element, depth, startIndex);
</span><span class="cx">             }
</span><span class="cx">         }
</span><del>-    } else if (node-&gt;isCharacterDataNode())
-        _processText(*toCharacterData(node));
</del><ins>+    } else if (node.isCharacterDataNode())
+        _processText(toCharacterData(node));
</ins><span class="cx"> 
</span><span class="cx">     if (isEnd)
</span><span class="cx">         _flags.reachedEnd = YES;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void HTMLConverter::_traverseFooterNode(DOMNode *node, NSInteger depth)
</del><ins>+void HTMLConverter::_traverseFooterNode(Element&amp; element, unsigned depth)
</ins><span class="cx"> {
</span><del>-    DOMElement *element = (DOMElement *)node;
-
</del><span class="cx">     if (_flags.reachedEnd)
</span><span class="cx">         return;
</span><del>-    if (_domRange &amp;&amp; !_flags.reachedStart &amp;&amp; !_caches-&gt;isAncestorsOfStartToBeConverted(core(node)))
</del><ins>+    if (!_flags.reachedStart &amp;&amp; !_caches-&gt;isAncestorsOfStartToBeConverted(element))
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     unsigned startOffset = 0;
</span><span class="cx">     unsigned endOffset = UINT_MAX;
</span><span class="cx">     bool isStart = false;
</span><span class="cx">     bool isEnd = false;
</span><del>-    if (_domRange) {
-        if (node == [_domRange startContainer]) {
-            startOffset = (NSUInteger)[_domRange startOffset];
-            isStart = true;
-            _flags.reachedStart = YES;
-        }
-        if (node == [_domRange endContainer]) {
-            endOffset = (NSUInteger)[_domRange endOffset];
-            isEnd = true;
-        }
</del><ins>+    if (&amp;element == m_range-&gt;startContainer()) {
+        startOffset = m_range-&gt;startOffset();
+        isStart = true;
+        _flags.reachedStart = YES;
</ins><span class="cx">     }
</span><ins>+    if (&amp;element == m_range-&gt;endContainer()) {
+        endOffset = m_range-&gt;endOffset();
+        isEnd = true;
+    }
+    
</ins><span class="cx">     if (_enterElement(element, YES)) {
</span><span class="cx">         NSUInteger startIndex = [_attrStr length];
</span><span class="cx">         if (_processElement(element, depth)) {
</span><del>-            Node* child = core(element)-&gt;firstChild();
</del><ins>+            Node* child = element.firstChild();
</ins><span class="cx">             for (NSUInteger i = 0; child; i++) {
</span><span class="cx">                 if (isStart &amp;&amp; i == startOffset)
</span><span class="cx">                     _domRangeStartIndex = [_attrStr length];
</span><span class="cx">                 if ((!isStart || startOffset &lt;= i) &amp;&amp; (!isEnd || endOffset &gt; i))
</span><del>-                    _traverseNode(child, depth + 1, true /* embedded */);
</del><ins>+                    _traverseNode(*child, depth + 1, true /* embedded */);
</ins><span class="cx">                 if (isEnd &amp;&amp; i + 1 &gt;= endOffset)
</span><span class="cx">                     _flags.reachedEnd = YES;
</span><span class="cx">                 if (_flags.reachedEnd)
</span><span class="lines">@@ -2506,26 +2479,6 @@
</span><span class="cx">     return commonAncestor;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void HTMLConverter::_loadFromDOMRange()
-{
-    ASSERT(_domRange);
-    if (-1 == _errorCode) {
-        Node* commonAncestorContainer = _caches-&gt;cacheAncestorsOfStartToBeConverted(*core(_domRange));
-        ASSERT(commonAncestorContainer);
-
-        _document = kit(commonAncestorContainer-&gt;ownerDocument());
-        _dataSource = (DocumentLoader *)core(_document)-&gt;frame()-&gt;loader().documentLoader();
-        
-        if (_document &amp;&amp; _dataSource) {
-            _domRangeStartIndex = 0;
-            _errorCode = 0;
-            _traverseNode(commonAncestorContainer, 0, false /* embedded */);
-            if (_domRangeStartIndex &gt; 0 &amp;&amp; _domRangeStartIndex &lt;= [_attrStr length])
-                [_attrStr deleteCharactersInRange:NSMakeRange(0, _domRangeStartIndex)];
-        }
-    }
-}
-
</del><span class="cx"> #if !PLATFORM(IOS)
</span><span class="cx"> 
</span><span class="cx"> static NSFileWrapper *fileWrapperForURL(DocumentLoader *dataSource, NSURL *URL)
</span><span class="lines">@@ -2586,7 +2539,7 @@
</span><span class="cx"> // This function supports more HTML features than the editing variant below, such as tables.
</span><span class="cx"> NSAttributedString *attributedStringFromRange(Range&amp; range)
</span><span class="cx"> {
</span><del>-    HTMLConverter converter(kit(&amp;range));
</del><ins>+    HTMLConverter converter(range);
</ins><span class="cx">     return converter.convert();
</span><span class="cx"> }
</span><span class="cx">     
</span></span></pre>
</div>
</div>

</body>
</html>