<!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>[166151] 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/166151">166151</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-03-23 23:42:01 -0700 (Sun, 23 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Convert WebHTMLConverter to C++
https://bugs.webkit.org/show_bug.cgi?id=130655

Patch by Sam Weinig &lt;sam@webkit.org&gt; on 2014-03-23
Reviewed by Andreas Kling.

- Mechanically converts the Objective-C class WebHTMLConverter, to the C++ HTMLConverter (lots of cleanup to follow).
- Removes unused members
    - _standardFontFamily (never assigned to)
    - _textSizeMultiplier (always exactly 1)
    - _webViewTextSizeMultiplier (always exactly 0)
    - _defaultFontSize (always exactly 12, changed to be constant)
    - _minimumFontSize (always exactly 1, changed to be constant)
    - _colorsForNodes (never assigned to)
    - _indexingLimit (always exactly 0)
    - _thumbnailLimit (always exactly 0)
    - _flags.isIndexing (always false)
    - _flags.isTesting (always false)

* editing/cocoa/HTMLConverter.mm:
(HTMLConverter::convert):
(HTMLConverter::HTMLConverter):
(HTMLConverter::~HTMLConverter):
(defaultParagraphStyle):
(_childrenForNode):
(HTMLConverter::_stringForNode):
(HTMLConverter::_getFloat):
(_webKitBundle):
(HTMLConverter::_elementIsBlockLevel):
(HTMLConverter::_elementHasOwnBackgroundColor):
(HTMLConverter::_blockLevelElementForNode):
(HTMLConverter::_colorForNode):
(HTMLConverter::_computedAttributesForElement):
(HTMLConverter::_attributesForElement):
(HTMLConverter::_newParagraphForElement):
(HTMLConverter::_newLineForElement):
(HTMLConverter::_newTabForElement):
(_WebMessageDocumentClass):
(HTMLConverter::_addAttachmentForElement):
(HTMLConverter::_addQuoteForElement):
(HTMLConverter::_addValue):
(HTMLConverter::_fillInBlock):
(HTMLConverter::_processMetaElementWithName):
(HTMLConverter::_processHeadElement):
(HTMLConverter::_enterElement):
(HTMLConverter::_addTableForElement):
(HTMLConverter::_addTableCellForElement):
(HTMLConverter::_processElement):
(HTMLConverter::_addMarkersToList):
(HTMLConverter::_exitElement):
(HTMLConverter::_processText):
(HTMLConverter::_traverseNode):
(HTMLConverter::_traverseFooterNode):
(HTMLConverter::_adjustTrailingNewline):
(HTMLConverter::_loadFromDOMRange):
(fileWrapperForURL):
(fileWrapperForElement):
(WebCore::attributedStringFromRange):
(WebCore::editingAttributedStringFromRange):</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 (166150 => 166151)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-03-24 05:16:33 UTC (rev 166150)
+++ trunk/Source/WebCore/ChangeLog        2014-03-24 06:42:01 UTC (rev 166151)
</span><span class="lines">@@ -1,3 +1,64 @@
</span><ins>+2014-03-23  Sam Weinig  &lt;sam@webkit.org&gt;
+
+        Convert WebHTMLConverter to C++
+        https://bugs.webkit.org/show_bug.cgi?id=130655
+
+        Reviewed by Andreas Kling.
+
+        - Mechanically converts the Objective-C class WebHTMLConverter, to the C++ HTMLConverter (lots of cleanup to follow).
+        - Removes unused members
+            - _standardFontFamily (never assigned to)
+            - _textSizeMultiplier (always exactly 1)
+            - _webViewTextSizeMultiplier (always exactly 0)
+            - _defaultFontSize (always exactly 12, changed to be constant)
+            - _minimumFontSize (always exactly 1, changed to be constant)
+            - _colorsForNodes (never assigned to)
+            - _indexingLimit (always exactly 0)
+            - _thumbnailLimit (always exactly 0)
+            - _flags.isIndexing (always false)
+            - _flags.isTesting (always false)
+
+        * editing/cocoa/HTMLConverter.mm:
+        (HTMLConverter::convert):
+        (HTMLConverter::HTMLConverter):
+        (HTMLConverter::~HTMLConverter):
+        (defaultParagraphStyle):
+        (_childrenForNode):
+        (HTMLConverter::_stringForNode):
+        (HTMLConverter::_getFloat):
+        (_webKitBundle):
+        (HTMLConverter::_elementIsBlockLevel):
+        (HTMLConverter::_elementHasOwnBackgroundColor):
+        (HTMLConverter::_blockLevelElementForNode):
+        (HTMLConverter::_colorForNode):
+        (HTMLConverter::_computedAttributesForElement):
+        (HTMLConverter::_attributesForElement):
+        (HTMLConverter::_newParagraphForElement):
+        (HTMLConverter::_newLineForElement):
+        (HTMLConverter::_newTabForElement):
+        (_WebMessageDocumentClass):
+        (HTMLConverter::_addAttachmentForElement):
+        (HTMLConverter::_addQuoteForElement):
+        (HTMLConverter::_addValue):
+        (HTMLConverter::_fillInBlock):
+        (HTMLConverter::_processMetaElementWithName):
+        (HTMLConverter::_processHeadElement):
+        (HTMLConverter::_enterElement):
+        (HTMLConverter::_addTableForElement):
+        (HTMLConverter::_addTableCellForElement):
+        (HTMLConverter::_processElement):
+        (HTMLConverter::_addMarkersToList):
+        (HTMLConverter::_exitElement):
+        (HTMLConverter::_processText):
+        (HTMLConverter::_traverseNode):
+        (HTMLConverter::_traverseFooterNode):
+        (HTMLConverter::_adjustTrailingNewline):
+        (HTMLConverter::_loadFromDOMRange):
+        (fileWrapperForURL):
+        (fileWrapperForElement):
+        (WebCore::attributedStringFromRange):
+        (WebCore::editingAttributedStringFromRange):
+
</ins><span class="cx"> 2014-03-23  Jinwoo Song  &lt;jinwoo7.song@samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove Dead Stores from editing directory
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingcocoaHTMLConvertermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm (166150 => 166151)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm        2014-03-24 05:16:33 UTC (rev 166150)
+++ trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm        2014-03-24 06:42:01 UTC (rev 166151)
</span><span class="lines">@@ -399,6 +399,9 @@
</span><span class="cx"> // Additional control Unicode characters
</span><span class="cx"> const unichar WebNextLineCharacter = 0x0085;
</span><span class="cx"> 
</span><ins>+static const CGFloat defaultFontSize = 12;
+static const CGFloat minimumFontSize = 1;
+
</ins><span class="cx"> class HTMLConverterCaches {
</span><span class="cx"> public:
</span><span class="cx">     String propertyValueForNode(Node&amp;, CSSPropertyID );
</span><span class="lines">@@ -428,7 +431,20 @@
</span><span class="cx"> + (void)document:(NSObject **)outDocument attachment:(NSTextAttachment **)outAttachment forURL:(NSURL *)url;
</span><span class="cx"> @end
</span><span class="cx"> 
</span><del>-@interface WebHTMLConverter : NSObject {
</del><ins>+class HTMLConverter {
+public:
+    HTMLConverter(DOMRange*);
+    ~HTMLConverter();
+    
+    NSAttributedString* convert()
+    {
+        _loadFromDOMRange();
+        if (_errorCode)
+            return nil;
+        return [[_attrStr retain] autorelease];
+    }
+    
+private:
</ins><span class="cx">     NSMutableAttributedString *_attrStr;
</span><span class="cx">     NSMutableDictionary *_documentAttrs;
</span><span class="cx">     NSURL *_baseURL;
</span><span class="lines">@@ -436,12 +452,6 @@
</span><span class="cx">     DOMRange *_domRange;
</span><span class="cx">     NSMutableArray *_domStartAncestors;
</span><span class="cx">     WebCore::DocumentLoader *_dataSource;
</span><del>-    NSString *_standardFontFamily;
-    CGFloat _textSizeMultiplier;
-    CGFloat _webViewTextSizeMultiplier;
-    CGFloat _defaultTabInterval;
-    CGFloat _defaultFontSize;
-    CGFloat _minimumFontSize;
</del><span class="cx">     NSMutableArray *_textLists;
</span><span class="cx">     NSMutableArray *_textBlocks;
</span><span class="cx">     NSMutableArray *_textTables;
</span><span class="lines">@@ -451,13 +461,12 @@
</span><span class="cx">     NSMutableArray *_textTableRows;
</span><span class="cx">     NSMutableArray *_textTableRowArrays;
</span><span class="cx">     NSMutableArray *_textTableRowBackgroundColors;
</span><del>-    NSMutableDictionary *_colorsForNodes;
</del><span class="cx">     NSMutableDictionary *_attributesForElements;
</span><span class="cx">     NSMutableDictionary *_fontCache;
</span><span class="cx">     NSMutableArray *_writingDirectionArray;
</span><ins>+    
+    CGFloat _defaultTabInterval;
</ins><span class="cx">     NSUInteger _domRangeStartIndex;
</span><del>-    NSInteger _indexingLimit;
-    NSUInteger _thumbnailLimit;
</del><span class="cx">     NSInteger _errorCode;
</span><span class="cx">     NSInteger _quoteLevel;
</span><span class="cx"> 
</span><span class="lines">@@ -467,36 +476,99 @@
</span><span class="cx">         unsigned int isSoft:1;
</span><span class="cx">         unsigned int reachedStart:1;
</span><span class="cx">         unsigned int reachedEnd:1;
</span><del>-        unsigned int isIndexing:1;
-        unsigned int isTesting:1;
</del><span class="cx">         unsigned int hasTrailingNewline:1;
</span><span class="cx">         unsigned int pad:26;
</span><span class="cx">     } _flags;
</span><del>-}
</del><ins>+    
+    void _loadFromDOMRange();
+    
+    NSString *_stringForNode(DOMNode *, CSSPropertyID);
+    PlatformColor *_colorForNode(DOMNode *, CSSPropertyID);
+    BOOL _getFloat(CGFloat *val, DOMNode *, CSSPropertyID);
</ins><span class="cx"> 
</span><del>-+ (NSAttributedString *)attributedStringFromRange:(Range*)range;
-#if !PLATFORM(IOS)
-+ (NSAttributedString *)editingAttributedStringFromRange:(Range*)range;
-#endif
-@end
</del><ins>+    void _traverseNode(DOMNode *node, NSInteger depth, BOOL embedded);
+    void _traverseFooterNode(DOMNode *node, NSInteger depth);
+    
+    NSDictionary *_computedAttributesForElement(DOMElement *);
+    NSDictionary *_attributesForElement(DOMElement *);
+    
+    bool _elementIsBlockLevel(DOMElement *);
+    bool _elementHasOwnBackgroundColor(DOMElement *);
+    DOMElement * _blockLevelElementForNode(DOMNode *);
+    
+    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);
+    void _fillInBlock(NSTextBlock *block, DOMElement *element, PlatformColor *backgroundColor, CGFloat extraMargin, CGFloat extraPadding, BOOL isTable);
+    void _processMetaElementWithName(NSString *name, NSString *content);
+    void _processHeadElement(DOMElement *element);
+    BOOL _enterElement(DOMElement *element, NSString *tag, NSString *displayVal, BOOL embedded);
+    void _addTableForElement(DOMElement *tableElement);
+    void _addTableCellForElement(DOMElement *tableCellElement);
+    BOOL _processElement(DOMElement *element, NSString *tag, NSString *displayVal, NSInteger depth);
+    void _addMarkersToList(NSTextList *list, NSRange range);
+    void _exitElement(DOMElement *element, NSString *tag, NSString *displayVal, NSInteger depth, NSUInteger startIndex);
+    void _processText(DOMCharacterData *text);
+    void _adjustTrailingNewline();
+};
</ins><span class="cx"> 
</span><del>-@interface WebHTMLConverter(WebHTMLConverterInternal)
</del><ins>+HTMLConverter::HTMLConverter(DOMRange* domRange)
+{
+    _domRange = [domRange retain];
+    _attrStr = [[NSMutableAttributedString alloc] init];
+    _documentAttrs = [[NSMutableDictionary alloc] init];
+    _baseURL = nil;
+    _document = nil;
+    _domStartAncestors = nil;
+    _dataSource = nullptr;
+    _textLists = [[NSMutableArray alloc] init];
+    _textBlocks = [[NSMutableArray alloc] init];
+    _textTables = [[NSMutableArray alloc] init];
+    _textTableFooters = [[NSMutableDictionary alloc] init];
+    _textTableSpacings = [[NSMutableArray alloc] init];
+    _textTablePaddings = [[NSMutableArray alloc] init];
+    _textTableRows = [[NSMutableArray alloc] init];
+    _textTableRowArrays = [[NSMutableArray alloc] init];
+    _textTableRowBackgroundColors = [[NSMutableArray alloc] init];
+    _attributesForElements = [[NSMutableDictionary alloc] init];
+    _fontCache = [[NSMutableDictionary alloc] init];
+    _writingDirectionArray = [[NSMutableArray alloc] init];
</ins><span class="cx"> 
</span><del>-- (id)init;
-- (id)initWithDOMRange:(DOMRange *)domRange;
-- (NSAttributedString *)attributedString;
</del><ins>+    _defaultTabInterval = 36;
+    _domRangeStartIndex = 0;
+    _errorCode = -1;
+    _quoteLevel = 0;
+    
+    _flags.isSoft = false;
+    _flags.reachedStart = false;
+    _flags.reachedEnd = false;
+    
+    _caches = std::make_unique&lt;HTMLConverterCaches&gt;();
+}
</ins><span class="cx"> 
</span><del>-- (NSString *)_stringForNode:(DOMNode *)node property:(CSSPropertyID)propertyId;
-- (PlatformColor *)_colorForNode:(DOMNode *)node property:(CSSPropertyID)propertyId;
-- (BOOL)_getFloat:(CGFloat *)val forNode:(DOMNode *)node property:(CSSPropertyID)propertyId;
</del><ins>+HTMLConverter::~HTMLConverter()
+{
+    [_attrStr release];
+    [_documentAttrs release];
+    [_domRange release];
+    [_domStartAncestors release];
+    [_textLists release];
+    [_textBlocks release];
+    [_textTables release];
+    [_textTableFooters release];
+    [_textTableSpacings release];
+    [_textTablePaddings release];
+    [_textTableRows release];
+    [_textTableRowArrays release];
+    [_textTableRowBackgroundColors release];
+    [_attributesForElements release];
+    [_fontCache release];
+    [_writingDirectionArray release];
+}
</ins><span class="cx"> 
</span><del>-- (void)_traverseNode:(DOMNode *)node depth:(NSInteger)depth embedded:(BOOL)embedded;
-- (void)_traverseFooterNode:(DOMNode *)node depth:(NSInteger)depth;
-
-@end
-
-@implementation WebHTMLConverter
-
</del><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">@@ -604,7 +676,7 @@
</span><span class="cx">     return font;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-+ (NSParagraphStyle *)defaultParagraphStyle
</del><ins>+static NSParagraphStyle *defaultParagraphStyle()
</ins><span class="cx"> {
</span><span class="cx">     static NSMutableParagraphStyle *defaultParagraphStyle = nil;
</span><span class="cx">     if (!defaultParagraphStyle) {
</span><span class="lines">@@ -615,7 +687,8 @@
</span><span class="cx">     return defaultParagraphStyle;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (NSArray *)_childrenForNode:(DOMNode *)node
</del><ins>+
+static NSArray *_childrenForNode(DOMNode *node)
</ins><span class="cx"> {
</span><span class="cx">     NSMutableArray *array = [NSMutableArray array];
</span><span class="cx">     DOMNode *child = [node firstChild];
</span><span class="lines">@@ -785,7 +858,7 @@
</span><span class="cx">     return String();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (NSString *)_stringForNode:(DOMNode *)node property:(CSSPropertyID)propertyId
</del><ins>+NSString *HTMLConverter::_stringForNode(DOMNode *node, CSSPropertyID propertyId)
</ins><span class="cx"> {
</span><span class="cx">     Node* coreNode = core(node);
</span><span class="cx">     if (!coreNode)
</span><span class="lines">@@ -866,7 +939,7 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (BOOL)_getFloat:(CGFloat *)val forNode:(DOMNode *)node property:(CSSPropertyID)propertyId
</del><ins>+BOOL HTMLConverter::_getFloat(CGFloat *val, DOMNode *node, CSSPropertyID propertyId)
</ins><span class="cx"> {
</span><span class="cx">     Node* coreNode = core(node);
</span><span class="cx">     if (!coreNode)
</span><span class="lines">@@ -879,6 +952,8 @@
</span><span class="cx">     return YES;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+
+#if PLATFORM(IOS)
</ins><span class="cx"> static NSString *_NSFirstPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde)
</span><span class="cx"> {
</span><span class="cx">     NSArray *array = NSSearchPathForDirectoriesInDomains(directory, domainMask, expandTilde);
</span><span class="lines">@@ -890,15 +965,15 @@
</span><span class="cx">     return _NSFirstPathForDirectoriesInDomains(NSLibraryDirectory, NSSystemDomainMask, YES);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (NSBundle *)_webKitBundle
</del><ins>+static NSBundle *_webKitBundle()
</ins><span class="cx"> {
</span><ins>+    // FIXME: This should probably use the WebCore bundle to avoid the layering violation.
</ins><span class="cx">     NSBundle *bundle = [NSBundle bundleWithIdentifier:@&quot;com.apple.WebKit&quot;];
</span><span class="cx">     if (!bundle)
</span><span class="cx">         bundle = [NSBundle bundleWithPath:[_NSSystemLibraryPath() stringByAppendingPathComponent:@&quot;Frameworks/WebKit.framework&quot;]];
</span><span class="cx">     return bundle;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-#if PLATFORM(IOS)
</del><span class="cx"> static inline UIColor *_platformColor(Color color)
</span><span class="cx"> {
</span><span class="cx">     return [getUIColorClass() _disambiguated_due_to_CIImage_colorWithCGColor:cachedCGColor(color, WebCore::ColorSpaceDeviceRGB)];
</span><span class="lines">@@ -984,23 +1059,23 @@
</span><span class="cx">     return element.hasTagName(htmlTag) || element.hasTagName(bodyTag) || propertyValueForNode(element, CSSPropertyDisplay).startsWith(&quot;table&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (BOOL)_elementIsBlockLevel:(DOMElement *)element
</del><ins>+bool HTMLConverter::_elementIsBlockLevel(DOMElement *element)
</ins><span class="cx"> {
</span><span class="cx">     return element &amp;&amp; _caches-&gt;isBlockElement(*core(element));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (BOOL)_elementHasOwnBackgroundColor:(DOMElement *)element
</del><ins>+bool HTMLConverter::_elementHasOwnBackgroundColor(DOMElement *element)
</ins><span class="cx"> {
</span><span class="cx">     return element &amp;&amp; _caches-&gt;elementHasOwnBackgroundColor(*core(element));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (DOMElement *)_blockLevelElementForNode:(DOMNode *)node
</del><ins>+DOMElement * HTMLConverter::_blockLevelElementForNode(DOMNode *node)
</ins><span class="cx"> {
</span><span class="cx">     DOMElement *element = (DOMElement *)node;
</span><span class="cx">     while (element &amp;&amp; [element nodeType] != DOM_ELEMENT_NODE)
</span><span class="cx">         element = (DOMElement *)[element parentNode];
</span><del>-    if (element &amp;&amp; ![self _elementIsBlockLevel:element])
-        element = [self _blockLevelElementForNode:[element parentNode]];
</del><ins>+    if (element &amp;&amp; !_elementIsBlockLevel(element))
+        element = _blockLevelElementForNode([element parentNode]);
</ins><span class="cx">     return element;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1062,7 +1137,7 @@
</span><span class="cx">     return Color();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (PlatformColor *)_colorForNode:(DOMNode *)node property:(CSSPropertyID)propertyId
</del><ins>+PlatformColor *HTMLConverter::_colorForNode(DOMNode *node, CSSPropertyID propertyId)
</ins><span class="cx"> {
</span><span class="cx">     Node* coreNode = core(node);
</span><span class="cx">     if (!coreNode)
</span><span class="lines">@@ -1078,39 +1153,39 @@
</span><span class="cx"> 
</span><span class="cx"> #define UIFloatIsZero(number) (fabs(number - 0) &lt; FLT_EPSILON)
</span><span class="cx"> 
</span><del>-- (NSDictionary *)_computedAttributesForElement:(DOMElement *)element
</del><ins>+NSDictionary *HTMLConverter::_computedAttributesForElement(DOMElement *element)
</ins><span class="cx"> {
</span><del>-    DOMElement *blockElement = [self _blockLevelElementForNode:element];
</del><ins>+    DOMElement *blockElement = _blockLevelElementForNode(element);
</ins><span class="cx">     NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
</span><span class="cx"> #if !PLATFORM(IOS)
</span><span class="cx">     NSFontManager *fontManager = [NSFontManager sharedFontManager];
</span><span class="cx"> #endif
</span><del>-    NSString *textDecoration = [self _stringForNode:element property:CSSPropertyTextDecoration];
-    NSString *verticalAlign = [self _stringForNode:element property:CSSPropertyVerticalAlign];
-    NSString *textShadow = [self _stringForNode:element property:CSSPropertyTextShadow];
-    NSString *fontLigatures = [self _stringForNode:element property:CSSPropertyWebkitFontVariantLigatures];
-    NSString *fontKerning = [self _stringForNode:element property:CSSPropertyWebkitFontKerning];
-    NSString *letterSpacing = [self _stringForNode:element property:CSSPropertyLetterSpacing];
</del><ins>+    NSString *textDecoration = _stringForNode(element, CSSPropertyTextDecoration);
+    NSString *verticalAlign = _stringForNode(element, CSSPropertyVerticalAlign);
+    NSString *textShadow = _stringForNode(element, CSSPropertyTextShadow);
+    NSString *fontLigatures = _stringForNode(element, CSSPropertyWebkitFontVariantLigatures);
+    NSString *fontKerning = _stringForNode(element, CSSPropertyWebkitFontKerning);
+    NSString *letterSpacing = _stringForNode(element, CSSPropertyLetterSpacing);
</ins><span class="cx">     CGFloat fontSize = 0;
</span><span class="cx">     CGFloat baselineOffset = 0;
</span><span class="cx">     CGFloat strokeWidth = 0.0;
</span><span class="cx">     PlatformFont *font = nil;
</span><span class="cx">     PlatformFont *actualFont = (PlatformFont *)[element _font];
</span><del>-    PlatformColor *foregroundColor = [self _colorForNode:element property:CSSPropertyColor];
-    PlatformColor *backgroundColor = [self _colorForNode:element property:CSSPropertyBackgroundColor];
-    PlatformColor *strokeColor = [self _colorForNode:element property:CSSPropertyWebkitTextStrokeColor];
</del><ins>+    PlatformColor *foregroundColor = _colorForNode(element, CSSPropertyColor);
+    PlatformColor *backgroundColor = _colorForNode(element, CSSPropertyBackgroundColor);
+    PlatformColor *strokeColor = _colorForNode(element, CSSPropertyWebkitTextStrokeColor);
</ins><span class="cx"> 
</span><del>-    if (![self _getFloat:&amp;fontSize forNode:element property:CSSPropertyFontSize] || fontSize &lt;= 0.0)
-        fontSize = _defaultFontSize;
-    fontSize *= _textSizeMultiplier;
-    if (fontSize &lt; _minimumFontSize) fontSize = _minimumFontSize;
</del><ins>+    if (!_getFloat(&amp;fontSize, element, CSSPropertyFontSize) || fontSize &lt;= 0.0)
+        fontSize = defaultFontSize;
+    if (fontSize &lt; minimumFontSize)
+        fontSize = minimumFontSize;
</ins><span class="cx">     if (fabs(floor(2.0 * fontSize + 0.5) / 2.0 - fontSize) &lt; 0.05)
</span><span class="cx">         fontSize = (CGFloat)floor(2.0 * fontSize + 0.5) / 2;
</span><span class="cx">     else if (fabs(floor(10.0 * fontSize + 0.5) / 10.0 - fontSize) &lt; 0.005)
</span><span class="cx">         fontSize = (CGFloat)floor(10.0 * fontSize + 0.5) / 10;
</span><span class="cx"> 
</span><span class="cx">     if (fontSize &lt;= 0.0)
</span><del>-        fontSize = 12;
</del><ins>+        fontSize = defaultFontSize;
</ins><span class="cx">     
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     if (actualFont)
</span><span class="lines">@@ -1120,14 +1195,12 @@
</span><span class="cx">         font = [fontManager convertFont:actualFont toSize:fontSize];
</span><span class="cx"> #endif
</span><span class="cx">     if (!font) {
</span><del>-        NSString *fontName = [[self _stringForNode:element property:CSSPropertyFontFamily] capitalizedString];
-        NSString *fontStyle = [self _stringForNode:element property:CSSPropertyFontStyle];
-        NSString *fontWeight = [self _stringForNode:element property:CSSPropertyFontWeight];
</del><ins>+        NSString *fontName = [_stringForNode(element, CSSPropertyFontFamily) capitalizedString];
+        NSString *fontStyle = _stringForNode(element, CSSPropertyFontStyle);
+        NSString *fontWeight = _stringForNode(element, CSSPropertyFontWeight);
</ins><span class="cx"> #if !PLATFORM(IOS)
</span><del>-        NSString *fontVariant = [self _stringForNode:element property:CSSPropertyFontVariant];
</del><ins>+        NSString *fontVariant = _stringForNode(element, CSSPropertyFontVariant);
</ins><span class="cx"> #endif
</span><del>-        if (!fontName)
-            fontName = _standardFontFamily;
</del><span class="cx">         if (fontName)
</span><span class="cx">             font = _fontForNameAndSize(fontName, fontSize, _fontCache);
</span><span class="cx">         if (!font)
</span><span class="lines">@@ -1167,14 +1240,14 @@
</span><span class="cx">         [attrs setObject:font forKey:NSFontAttributeName];
</span><span class="cx">     if (foregroundColor)
</span><span class="cx">         [attrs setObject:foregroundColor forKey:NSForegroundColorAttributeName];
</span><del>-    if (backgroundColor &amp;&amp; ![self _elementHasOwnBackgroundColor:element])
</del><ins>+    if (backgroundColor &amp;&amp; !_elementHasOwnBackgroundColor(element))
</ins><span class="cx">         [attrs setObject:backgroundColor forKey:NSBackgroundColorAttributeName];
</span><span class="cx"> 
</span><del>-    if ([self _getFloat:&amp;strokeWidth forNode:element property:CSSPropertyWebkitTextStrokeWidth]) {
</del><ins>+    if (_getFloat(&amp;strokeWidth, element, CSSPropertyWebkitTextStrokeWidth)) {
</ins><span class="cx">         float textStrokeWidth = strokeWidth / ([font pointSize] * 0.01);
</span><span class="cx">         [attrs setObject:[NSNumber numberWithDouble:textStrokeWidth] forKey:NSStrokeWidthAttributeName];
</span><span class="cx">     }
</span><del>-    if(strokeColor)
</del><ins>+    if (strokeColor)
</ins><span class="cx">         [attrs setObject:strokeColor forKey:NSStrokeColorAttributeName];
</span><span class="cx">     if (fontKerning || letterSpacing) {
</span><span class="cx">         if ([fontKerning rangeOfString:@&quot;none&quot;].location != NSNotFound)
</span><span class="lines">@@ -1208,7 +1281,7 @@
</span><span class="cx">         if ([verticalAlign rangeOfString:@&quot;sub&quot;].location != NSNotFound)
</span><span class="cx">             [attrs setObject:[NSNumber numberWithInteger:-1] forKey:NSSuperscriptAttributeName];
</span><span class="cx">     }
</span><del>-    if ([self _getFloat:&amp;baselineOffset forNode:element property:CSSPropertyVerticalAlign])
</del><ins>+    if (_getFloat(&amp;baselineOffset, element, CSSPropertyVerticalAlign))
</ins><span class="cx">         [attrs setObject:[NSNumber numberWithDouble:baselineOffset] forKey:NSBaselineOffsetAttributeName];
</span><span class="cx">     if (textShadow &amp;&amp; [textShadow length] &gt; 4) {
</span><span class="cx">         NSShadow *shadow = _shadowForShadowStyle(textShadow);
</span><span class="lines">@@ -1219,17 +1292,16 @@
</span><span class="cx">         [attrs setObject:[NSArray arrayWithArray:_writingDirectionArray] forKey:NSWritingDirectionAttributeName];
</span><span class="cx">     
</span><span class="cx">     if (blockElement) {
</span><del>-        NSMutableParagraphStyle *paragraphStyle = [[[self class] defaultParagraphStyle] mutableCopy];
</del><ins>+        NSMutableParagraphStyle *paragraphStyle = [defaultParagraphStyle() mutableCopy];
</ins><span class="cx">         NSString *blockTag = [blockElement tagName];
</span><span class="cx">         BOOL isParagraph = ([@&quot;P&quot; isEqualToString:blockTag] || [@&quot;LI&quot; isEqualToString:blockTag] || ([blockTag hasPrefix:@&quot;H&quot;] &amp;&amp; 2 == [blockTag length]));
</span><del>-        NSString *textAlign = [self _stringForNode:blockElement property:CSSPropertyTextAlign];
-        NSString *direction = [self _stringForNode:blockElement property:CSSPropertyDirection];
-        NSString *hyphenation = [self _stringForNode:blockElement property:CSSPropertyWebkitHyphens];
</del><ins>+        NSString *textAlign = _stringForNode(blockElement, CSSPropertyTextAlign);
+        NSString *direction = _stringForNode(blockElement, CSSPropertyDirection);
+        NSString *hyphenation = _stringForNode(blockElement, CSSPropertyWebkitHyphens);
</ins><span class="cx">         CGFloat leftMargin = 0;
</span><span class="cx">         CGFloat rightMargin = 0;
</span><span class="cx">         CGFloat bottomMargin = 0;
</span><span class="cx">         CGFloat textIndent = 0;
</span><del>-        CGFloat lineHeight = 0;
</del><span class="cx">         if (textAlign) {
</span><span class="cx">             // WebKit can return -khtml-left, -khtml-right, -khtml-center
</span><span class="cx">             if ([textAlign hasSuffix:@&quot;left&quot;])
</span><span class="lines">@@ -1259,17 +1331,15 @@
</span><span class="cx">                 [paragraphStyle setHeaderLevel:headerLevel];
</span><span class="cx">         }
</span><span class="cx">         if (isParagraph) {
</span><del>-            if ([self _getFloat:&amp;leftMargin forNode:blockElement property:CSSPropertyMarginLeft] &amp;&amp; leftMargin &gt; 0.0)
</del><ins>+            if (_getFloat(&amp;leftMargin, blockElement, CSSPropertyMarginLeft) &amp;&amp; leftMargin &gt; 0.0)
</ins><span class="cx">                 [paragraphStyle setHeadIndent:leftMargin];
</span><del>-            if ([self _getFloat:&amp;textIndent forNode:blockElement property:CSSPropertyTextIndent])
</del><ins>+            if (_getFloat(&amp;textIndent, blockElement, CSSPropertyTextIndent))
</ins><span class="cx">                 [paragraphStyle setFirstLineHeadIndent:[paragraphStyle headIndent] + textIndent];
</span><del>-            if ([self _getFloat:&amp;rightMargin forNode:blockElement property:CSSPropertyMarginRight] &amp;&amp; rightMargin &gt; 0.0)
</del><ins>+            if (_getFloat(&amp;rightMargin, blockElement, CSSPropertyMarginRight) &amp;&amp; rightMargin &gt; 0.0)
</ins><span class="cx">                 [paragraphStyle setTailIndent:-rightMargin];
</span><del>-            if ([self _getFloat:&amp;bottomMargin forNode:blockElement property:CSSPropertyMarginBottom] &amp;&amp; bottomMargin &gt; 0.0)
</del><ins>+            if (_getFloat(&amp;bottomMargin, blockElement, CSSPropertyMarginBottom) &amp;&amp; bottomMargin &gt; 0.0)
</ins><span class="cx">                 [paragraphStyle setParagraphSpacing:bottomMargin];
</span><span class="cx">         }
</span><del>-        if (_webViewTextSizeMultiplier &gt; 0.0 &amp;&amp; [self _getFloat:&amp;lineHeight forNode:element property:CSSPropertyLineHeight] &amp;&amp; lineHeight &gt; 0.0)
-            [paragraphStyle setMinimumLineHeight:lineHeight / _webViewTextSizeMultiplier];
</del><span class="cx">         if ([_textLists count] &gt; 0)
</span><span class="cx">             [paragraphStyle setTextLists:_textLists];
</span><span class="cx">         if ([_textBlocks count] &gt; 0)
</span><span class="lines">@@ -1280,13 +1350,13 @@
</span><span class="cx">     return attrs;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (NSDictionary *)_attributesForElement:(DOMElement *)element
</del><ins>+NSDictionary *HTMLConverter::_attributesForElement(DOMElement *element)
</ins><span class="cx"> {
</span><span class="cx">     NSDictionary *result;
</span><span class="cx">     if (element) {
</span><span class="cx">         result = [_attributesForElements objectForKey:element];
</span><span class="cx">         if (!result) {
</span><del>-            result = [self _computedAttributesForElement:element];
</del><ins>+            result = _computedAttributesForElement(element);
</ins><span class="cx">             [_attributesForElements setObject:result forKey:element];
</span><span class="cx">         }
</span><span class="cx">     } else
</span><span class="lines">@@ -1295,11 +1365,11 @@
</span><span class="cx"> 
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_newParagraphForElement:(DOMElement *)element tag:(NSString *)tag allowEmpty:(BOOL)flag suppressTrailingSpace:(BOOL)suppress
</del><ins>+void HTMLConverter::_newParagraphForElement(DOMElement *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><del>-    NSRange rangeToReplace = (suppress &amp;&amp; _flags.isSoft &amp;&amp; (lastChar == ' ' || lastChar == NSLineSeparatorCharacter)) ? NSMakeRange(textLength - 1, 1) : NSMakeRange(textLength, 0);
</del><ins>+    NSRange rangeToReplace = (suppressTrailingSpace &amp;&amp; _flags.isSoft &amp;&amp; (lastChar == ' ' || lastChar == NSLineSeparatorCharacter)) ? NSMakeRange(textLength - 1, 1) : NSMakeRange(textLength, 0);
</ins><span class="cx">     BOOL needBreak = (flag || lastChar != '\n');
</span><span class="cx">     if (needBreak) {
</span><span class="cx">         NSString *string = (([@&quot;BODY&quot; isEqualToString:tag] || [@&quot;HTML&quot; isEqualToString:tag]) ? @&quot;&quot; : @&quot;\n&quot;);
</span><span class="lines">@@ -1308,16 +1378,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>-        if (!_flags.isIndexing) {
-            NSDictionary *attrs = [self _attributesForElement:element];
-            if (!_flags.isTesting &amp;&amp; rangeToReplace.length &gt; 0)
-                [_attrStr setAttributes:attrs range:rangeToReplace];
-        }
</del><ins>+        NSDictionary *attrs = _attributesForElement(element);
+        if (rangeToReplace.length &gt; 0)
+            [_attrStr setAttributes:attrs range:rangeToReplace];
</ins><span class="cx">         _flags.isSoft = YES;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_newLineForElement:(DOMElement *)element
</del><ins>+void HTMLConverter::_newLineForElement(DOMElement *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">@@ -1325,16 +1393,15 @@
</span><span class="cx">     NSRange rangeToReplace = NSMakeRange(textLength, 0);
</span><span class="cx">     [_attrStr replaceCharactersInRange:rangeToReplace withString:string.get()];
</span><span class="cx">     rangeToReplace.length = [string length];
</span><del>-    if (rangeToReplace.location &lt; _domRangeStartIndex) _domRangeStartIndex += rangeToReplace.length;
-    if (!_flags.isIndexing) {
-        NSDictionary *attrs = [self _attributesForElement:element];
-        if (!_flags.isTesting &amp;&amp; rangeToReplace.length &gt; 0)
-            [_attrStr setAttributes:attrs range:rangeToReplace];
-    }
</del><ins>+    if (rangeToReplace.location &lt; _domRangeStartIndex)
+        _domRangeStartIndex += rangeToReplace.length;
+    NSDictionary *attrs = _attributesForElement(element);
+    if (rangeToReplace.length &gt; 0)
+        [_attrStr setAttributes:attrs range:rangeToReplace];
</ins><span class="cx">     _flags.isSoft = YES;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_newTabForElement:(DOMElement *)element
</del><ins>+void HTMLConverter::_newTabForElement(DOMElement *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">@@ -1344,15 +1411,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>-    if (!_flags.isIndexing) {
-        NSDictionary *attrs = [self _attributesForElement:element];
-        if (!_flags.isTesting &amp;&amp; rangeToReplace.length &gt; 0)
-            [_attrStr setAttributes:attrs range:rangeToReplace];
-    }
</del><ins>+    NSDictionary *attrs = _attributesForElement(element);
+    if (rangeToReplace.length &gt; 0)
+        [_attrStr setAttributes:attrs range:rangeToReplace];
</ins><span class="cx">     _flags.isSoft = YES;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (Class)_WebMessageDocumentClass
</del><ins>+static Class _WebMessageDocumentClass()
</ins><span class="cx"> {
</span><span class="cx">     static Class _WebMessageDocumentClass = Nil;
</span><span class="cx">     static BOOL lookedUpClass = NO;
</span><span class="lines">@@ -1366,7 +1431,7 @@
</span><span class="cx">     return _WebMessageDocumentClass;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (BOOL)_addAttachmentForElement:(DOMElement *)element URL:(NSURL *)url needsParagraph:(BOOL)needsParagraph usePlaceholder:(BOOL)flag
</del><ins>+BOOL HTMLConverter::_addAttachmentForElement(DOMElement *element, NSURL *url, BOOL needsParagraph, BOOL usePlaceholder)
</ins><span class="cx"> {
</span><span class="cx">     BOOL retval = NO, notFound = NO;
</span><span class="cx">     NSFileWrapper *fileWrapper = nil;
</span><span class="lines">@@ -1374,8 +1439,6 @@
</span><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><del>-    if (_flags.isIndexing)
-        return NO;
</del><span class="cx">     if ([url isFileURL]) {
</span><span class="cx">         NSString *path = [[url path] stringByStandardizingPath];
</span><span class="cx">         if (path)
</span><span class="lines">@@ -1387,7 +1450,7 @@
</span><span class="cx">             resource = dataSource-&gt;subresource(url);
</span><span class="cx"> 
</span><span class="cx">         const String&amp; mimeType = resource-&gt;mimeType();
</span><del>-        if (flag &amp;&amp; resource &amp;&amp; mimeType == &quot;text/html&quot;)
</del><ins>+        if (usePlaceholder &amp;&amp; resource &amp;&amp; mimeType == &quot;text/html&quot;)
</ins><span class="cx">             notFound = YES;
</span><span class="cx">         if (resource &amp;&amp; !notFound) {
</span><span class="cx">             fileWrapper = [[[NSFileWrapper alloc] initRegularFileWithContents:resource-&gt;data()-&gt;createNSData().get()] autorelease];
</span><span class="lines">@@ -1397,18 +1460,22 @@
</span><span class="cx"> #if !PLATFORM(IOS)
</span><span class="cx">     if (!fileWrapper &amp;&amp; !notFound) {
</span><span class="cx">         fileWrapper = fileWrapperForURL(dataSource, url);
</span><del>-        if (flag &amp;&amp; fileWrapper &amp;&amp; [[[[fileWrapper preferredFilename] pathExtension] lowercaseString] hasPrefix:@&quot;htm&quot;]) notFound = YES;
-        if (notFound) fileWrapper = nil;
</del><ins>+        if (usePlaceholder &amp;&amp; fileWrapper &amp;&amp; [[[[fileWrapper preferredFilename] pathExtension] lowercaseString] hasPrefix:@&quot;htm&quot;])
+            notFound = YES;
+        if (notFound)
+            fileWrapper = nil;
</ins><span class="cx">     }
</span><span class="cx">     if (!fileWrapper &amp;&amp; !notFound) {
</span><span class="cx">         fileWrapper = fileWrapperForURL(_dataSource, url);
</span><del>-        if (flag &amp;&amp; fileWrapper &amp;&amp; [[[[fileWrapper preferredFilename] pathExtension] lowercaseString] hasPrefix:@&quot;htm&quot;]) notFound = YES;
-        if (notFound) fileWrapper = nil;
</del><ins>+        if (usePlaceholder &amp;&amp; fileWrapper &amp;&amp; [[[[fileWrapper preferredFilename] pathExtension] lowercaseString] hasPrefix:@&quot;htm&quot;])
+            notFound = YES;
+        if (notFound)
+            fileWrapper = nil;
</ins><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx">     if (!fileWrapper &amp;&amp; !notFound &amp;&amp; url) {
</span><span class="cx">         // Special handling for Mail attachments, until WebKit provides a standard way to get the data.
</span><del>-        Class WebMessageDocumentClass = [self _WebMessageDocumentClass];
</del><ins>+        Class WebMessageDocumentClass = _WebMessageDocumentClass();
</ins><span class="cx">         if (WebMessageDocumentClass) {
</span><span class="cx">             NSTextAttachment *mimeTextAttachment = nil;
</span><span class="cx">             [WebMessageDocumentClass document:NULL attachment:&amp;mimeTextAttachment forURL:url];
</span><span class="lines">@@ -1418,11 +1485,11 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    if (fileWrapper || flag) {
</del><ins>+    if (fileWrapper || usePlaceholder) {
</ins><span class="cx">         NSUInteger textLength = [_attrStr length];
</span><span class="cx">         RetainPtr&lt;NSTextAttachment&gt; attachment = adoptNS([[PlatformNSTextAttachment alloc] initWithFileWrapper:fileWrapper]);
</span><span class="cx"> #if PLATFORM(IOS)
</span><del>-        NSString *vAlign = [self _stringForNode:element property:CSSPropertyVerticalAlign];
</del><ins>+        NSString *vAlign = _stringForNode(element, CSSPropertyVerticalAlign);
</ins><span class="cx">         attachment.get().bounds = CGRectMake(0, ([vAlign floatValue] / 100.) * element.clientHeight, element.clientWidth, element.clientHeight);
</span><span class="cx"> #endif
</span><span class="cx">         RetainPtr&lt;NSString&gt; string = adoptNS([[NSString alloc] initWithFormat:(needsParagraph ? @&quot;%C\n&quot; : @&quot;%C&quot;), static_cast&lt;unichar&gt;(NSAttachmentCharacter)]);
</span><span class="lines">@@ -1436,7 +1503,7 @@
</span><span class="cx">         } else {
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">             [attachment release];
</span><del>-            NSURL *missingImageURL = [[self _webKitBundle] URLForResource:@&quot;missing_image&quot; withExtension:@&quot;tiff&quot;];
</del><ins>+            NSURL *missingImageURL = [_webKitBundle() URLForResource:@&quot;missing_image&quot; withExtension:@&quot;tiff&quot;];
</ins><span class="cx">             ASSERT_WITH_MESSAGE(missingImageURL != nil, &quot;Unable to find missing_image.tiff!&quot;);
</span><span class="cx">             NSFileWrapper *missingImageFileWrapper = [[[NSFileWrapper alloc] initWithURL:missingImageURL options:0 error:NULL] autorelease];
</span><span class="cx">             attachment = [[PlatformNSTextAttachment alloc] initWithFileWrapper:missingImageFileWrapper];
</span><span class="lines">@@ -1452,8 +1519,8 @@
</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 = [self _attributesForElement:element];
-        if (!_flags.isTesting &amp;&amp; rangeToReplace.length &gt; 0) {
</del><ins>+        attrs = _attributesForElement(element);
+        if (rangeToReplace.length &gt; 0) {
</ins><span class="cx">             [_attrStr setAttributes:attrs range:rangeToReplace];
</span><span class="cx">             rangeToReplace.length = 1;
</span><span class="cx">             [_attrStr addAttribute:NSAttachmentAttributeName value:attachment.get() range:rangeToReplace];
</span><span class="lines">@@ -1464,7 +1531,7 @@
</span><span class="cx">     return retval;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_addQuoteForElement:(DOMElement *)element opening:(BOOL)opening level:(NSInteger)level
</del><ins>+void HTMLConverter::_addQuoteForElement(DOMElement *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">@@ -1474,15 +1541,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>-    if (!_flags.isIndexing) {
-        RetainPtr&lt;NSDictionary&gt; attrs = [self _attributesForElement:element];
-        if (!_flags.isTesting &amp;&amp; rangeToReplace.length &gt; 0)
-            [_attrStr setAttributes:attrs.get() range:rangeToReplace];
-    }
</del><ins>+    RetainPtr&lt;NSDictionary&gt; attrs = _attributesForElement(element);
+    if (rangeToReplace.length &gt; 0)
+        [_attrStr setAttributes:attrs.get() range:rangeToReplace];
</ins><span class="cx">     _flags.isSoft = NO;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_addValue:(NSString *)value forElement:(DOMElement *)element
</del><ins>+void HTMLConverter::_addValue(NSString *value, DOMElement *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">@@ -1492,16 +1557,14 @@
</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>-        if (!_flags.isIndexing) {
-            RetainPtr&lt;NSDictionary&gt; attrs = [self _attributesForElement:element];
-            if (!_flags.isTesting &amp;&amp; rangeToReplace.length &gt; 0)
-                [_attrStr setAttributes:attrs.get() range:rangeToReplace];
-        }
</del><ins>+        RetainPtr&lt;NSDictionary&gt; attrs = _attributesForElement(element);
+        if (rangeToReplace.length &gt; 0)
+            [_attrStr setAttributes:attrs.get() range:rangeToReplace];
</ins><span class="cx">         _flags.isSoft = NO;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_fillInBlock:(NSTextBlock *)block forElement:(DOMElement *)element backgroundColor:(PlatformColor *)backgroundColor extraMargin:(CGFloat)extraMargin extraPadding:(CGFloat)extraPadding isTable:(BOOL)isTable
</del><ins>+void HTMLConverter::_fillInBlock(NSTextBlock *block, DOMElement *element, PlatformColor *backgroundColor, CGFloat extraMargin, CGFloat extraPadding, BOOL isTable)
</ins><span class="cx"> {
</span><span class="cx">     CGFloat val = 0;
</span><span class="cx">     PlatformColor *color = nil;
</span><span class="lines">@@ -1509,57 +1572,59 @@
</span><span class="cx">     NSString *width = isTableCellElement ? [(DOMHTMLTableCellElement *)element width] : [element getAttribute:@&quot;width&quot;];
</span><span class="cx"> 
</span><span class="cx">     if ((width &amp;&amp; [width length]) || !isTable) {
</span><del>-        if ([self _getFloat:&amp;val forNode:element property:CSSPropertyWidth])
</del><ins>+        if (_getFloat(&amp;val, element, CSSPropertyWidth))
</ins><span class="cx">             [block setValue:val type:NSTextBlockAbsoluteValueType forDimension:NSTextBlockWidth];
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    if ([self _getFloat:&amp;val forNode:element property:CSSPropertyMinWidth])
</del><ins>+    if (_getFloat(&amp;val, element, CSSPropertyMinWidth))
</ins><span class="cx">         [block setValue:val type:NSTextBlockAbsoluteValueType forDimension:NSTextBlockMinimumWidth];
</span><del>-    if ([self _getFloat:&amp;val forNode:element property:CSSPropertyMaxWidth])
</del><ins>+    if (_getFloat(&amp;val, element, CSSPropertyMaxWidth))
</ins><span class="cx">         [block setValue:val type:NSTextBlockAbsoluteValueType forDimension:NSTextBlockMaximumWidth];
</span><del>-    if ([self _getFloat:&amp;val forNode:element property:CSSPropertyMinHeight])
</del><ins>+    if (_getFloat(&amp;val, element, CSSPropertyMinHeight))
</ins><span class="cx">         [block setValue:val type:NSTextBlockAbsoluteValueType forDimension:NSTextBlockMinimumHeight];
</span><del>-    if ([self _getFloat:&amp;val forNode:element property:CSSPropertyMaxHeight])
</del><ins>+    if (_getFloat(&amp;val, element, CSSPropertyMaxHeight))
</ins><span class="cx">         [block setValue:val type:NSTextBlockAbsoluteValueType forDimension:NSTextBlockMaximumHeight];
</span><span class="cx"> 
</span><del>-    if ([self _getFloat:&amp;val forNode:element property:CSSPropertyPaddingLeft])
</del><ins>+    if (_getFloat(&amp;val, element, CSSPropertyPaddingLeft))
</ins><span class="cx">         [block setWidth:val + extraPadding type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockPadding edge:NSMinXEdge];
</span><del>-    else [block setWidth:extraPadding type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockPadding edge:NSMinXEdge];
-    if ([self _getFloat:&amp;val forNode:element property:CSSPropertyPaddingTop])
</del><ins>+    else
+        [block setWidth:extraPadding type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockPadding edge:NSMinXEdge];
+    if (_getFloat(&amp;val, element, CSSPropertyPaddingTop))
</ins><span class="cx">         [block setWidth:val + extraPadding type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockPadding edge:NSMinYEdge]; else [block setWidth:extraPadding type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockPadding edge:NSMinYEdge];
</span><del>-    if ([self _getFloat:&amp;val forNode:element property:CSSPropertyPaddingRight])
</del><ins>+    if (_getFloat(&amp;val, element, CSSPropertyPaddingRight))
</ins><span class="cx">         [block setWidth:val + extraPadding type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockPadding edge:NSMaxXEdge]; else [block setWidth:extraPadding type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockPadding edge:NSMaxXEdge];
</span><del>-    if ([self _getFloat:&amp;val forNode:element property:CSSPropertyPaddingBottom])
</del><ins>+    if (_getFloat(&amp;val, element, CSSPropertyPaddingBottom))
</ins><span class="cx">         [block setWidth:val + extraPadding type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockPadding edge:NSMaxYEdge]; else [block setWidth:extraPadding type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockPadding edge:NSMaxYEdge];
</span><span class="cx">     
</span><del>-    if ([self _getFloat:&amp;val forNode:element property:CSSPropertyBorderLeftWidth])
</del><ins>+    if (_getFloat(&amp;val, element, CSSPropertyBorderLeftWidth))
</ins><span class="cx">         [block setWidth:val type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockBorder edge:NSMinXEdge];
</span><del>-    if ([self _getFloat:&amp;val forNode:element property:CSSPropertyBorderTopWidth])
</del><ins>+    if (_getFloat(&amp;val, element, CSSPropertyBorderTopWidth))
</ins><span class="cx">         [block setWidth:val type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockBorder edge:NSMinYEdge];
</span><del>-    if ([self _getFloat:&amp;val forNode:element property:CSSPropertyBorderRightWidth])
</del><ins>+    if (_getFloat(&amp;val, element, CSSPropertyBorderRightWidth))
</ins><span class="cx">         [block setWidth:val type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockBorder edge:NSMaxXEdge];
</span><del>-    if ([self _getFloat:&amp;val forNode:element property:CSSPropertyBorderBottomWidth])
</del><ins>+    if (_getFloat(&amp;val, element, CSSPropertyBorderBottomWidth))
</ins><span class="cx">         [block setWidth:val type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockBorder edge:NSMaxYEdge];
</span><span class="cx"> 
</span><del>-    if ([self _getFloat:&amp;val forNode:element property:CSSPropertyMarginLeft])
</del><ins>+    if (_getFloat(&amp;val, element, CSSPropertyMarginLeft))
</ins><span class="cx">         [block setWidth:val + extraMargin type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockMargin edge:NSMinXEdge]; else [block setWidth:extraMargin type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockMargin edge:NSMinXEdge];
</span><del>-    if ([self _getFloat:&amp;val forNode:element property:CSSPropertyMarginTop])
</del><ins>+    if (_getFloat(&amp;val, element, CSSPropertyMarginTop))
</ins><span class="cx">         [block setWidth:val + extraMargin type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockMargin edge:NSMinYEdge]; else [block setWidth:extraMargin type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockMargin edge:NSMinYEdge];
</span><del>-    if ([self _getFloat:&amp;val forNode:element property:CSSPropertyMarginRight])
</del><ins>+    if (_getFloat(&amp;val, element, CSSPropertyMarginRight))
</ins><span class="cx">         [block setWidth:val + extraMargin type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockMargin edge:NSMaxXEdge]; else [block setWidth:extraMargin type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockMargin edge:NSMaxXEdge];
</span><del>-    if ([self _getFloat:&amp;val forNode:element property:CSSPropertyMarginBottom])
</del><ins>+    if (_getFloat(&amp;val, element, CSSPropertyMarginBottom))
</ins><span class="cx">         [block setWidth:val + extraMargin type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockMargin edge:NSMaxYEdge]; else [block setWidth:extraMargin type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockMargin edge:NSMaxYEdge];
</span><span class="cx"> 
</span><del>-    if ((color = [self _colorForNode:element property:CSSPropertyBackgroundColor]))
</del><ins>+    if ((color = _colorForNode(element, CSSPropertyBackgroundColor)))
</ins><span class="cx">         [block setBackgroundColor:color];
</span><del>-    if (!color &amp;&amp; backgroundColor) [block setBackgroundColor:backgroundColor];
-    if ((color = [self _colorForNode:element property:CSSPropertyBorderLeftColor]))
</del><ins>+    if (!color &amp;&amp; backgroundColor)
+        [block setBackgroundColor:backgroundColor];
+    if ((color = _colorForNode(element, CSSPropertyBorderLeftColor)))
</ins><span class="cx">         [block setBorderColor:color forEdge:NSMinXEdge];
</span><del>-    if ((color = [self _colorForNode:element property:CSSPropertyBorderTopColor]))
</del><ins>+    if ((color = _colorForNode(element, CSSPropertyBorderTopColor)))
</ins><span class="cx">         [block setBorderColor:color forEdge:NSMinYEdge];
</span><del>-    if ((color = [self _colorForNode:element property:CSSPropertyBorderRightColor]))
</del><ins>+    if ((color = _colorForNode(element, CSSPropertyBorderRightColor)))
</ins><span class="cx">         [block setBorderColor:color forEdge:NSMaxXEdge];
</span><del>-    if ((color = [self _colorForNode:element property:CSSPropertyBorderBottomColor]))
</del><ins>+    if ((color = _colorForNode(element, CSSPropertyBorderBottomColor)))
</ins><span class="cx">         [block setBorderColor:color forEdge:NSMaxYEdge];
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1629,7 +1694,8 @@
</span><span class="cx">     return ((col1 &lt; col2) ? NSOrderedAscending : ((col1 == col2) ? NSOrderedSame : NSOrderedDescending));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_processMetaElementWithName:(NSString *)name content:(NSString *)content {
</del><ins>+void HTMLConverter::_processMetaElementWithName(NSString *name, NSString *content)
+{
</ins><span class="cx">     NSString *key = nil;
</span><span class="cx">     if (NSOrderedSame == [@&quot;CocoaVersion&quot; compare:name options:NSCaseInsensitiveSearch]) {
</span><span class="cx">         CGFloat versionNumber = [content doubleValue];
</span><span class="lines">@@ -1691,9 +1757,10 @@
</span><span class="cx">         [_documentAttrs setObject:content forKey:key];
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_processHeadElement:(DOMElement *)element {
</del><ins>+void HTMLConverter::_processHeadElement(DOMElement *element)
+{
</ins><span class="cx">     // ??? should gather data from other sources e.g. Word, but for that we would need to be able to get comments from DOM
</span><del>-    NSArray *childNodes = [self _childrenForNode:element];
</del><ins>+    NSArray *childNodes = _childrenForNode(element);
</ins><span class="cx">     NSUInteger count = [childNodes count];
</span><span class="cx">     for (NSUInteger i = 0; i &lt; count; i++) {
</span><span class="cx">         DOMNode *node = [childNodes objectAtIndex:i];
</span><span class="lines">@@ -1705,26 +1772,26 @@
</span><span class="cx">                 NSString *name = [(DOMHTMLMetaElement *)element name];
</span><span class="cx">                 NSString *content = [(DOMHTMLMetaElement *)element content];
</span><span class="cx">                 if (name &amp;&amp; content)
</span><del>-                    [self _processMetaElementWithName:name content:content];
</del><ins>+                    _processMetaElementWithName(name, content);
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (BOOL)_enterElement:(DOMElement *)element tag:(NSString *)tag display:(NSString *)displayVal embedded:(BOOL)embedded
</del><ins>+BOOL HTMLConverter::_enterElement(DOMElement *element, NSString *tag, NSString *displayVal, BOOL embedded)
</ins><span class="cx"> {
</span><span class="cx">     if ([@&quot;HEAD&quot; isEqualToString:tag] &amp;&amp; !embedded)
</span><del>-        [self _processHeadElement:element];
</del><ins>+        _processHeadElement(element);
</ins><span class="cx">     else if (!displayVal || !([@&quot;none&quot; isEqualToString:displayVal] || [@&quot;table-column&quot; isEqualToString:displayVal] || [@&quot;table-column-group&quot; isEqualToString:displayVal])) {
</span><del>-        if ([self _elementIsBlockLevel:element] &amp;&amp; ![@&quot;BR&quot; isEqualToString:tag] &amp;&amp; !([@&quot;table-cell&quot; isEqualToString:displayVal] &amp;&amp; [_textTables count] == 0) 
</del><ins>+        if (_elementIsBlockLevel(element) &amp;&amp; ![@&quot;BR&quot; isEqualToString:tag] &amp;&amp; !([@&quot;table-cell&quot; isEqualToString:displayVal] &amp;&amp; [_textTables count] == 0)
</ins><span class="cx">             &amp;&amp; !([_textLists count] &gt; 0 &amp;&amp; [@&quot;block&quot; isEqualToString:displayVal] &amp;&amp; ![@&quot;LI&quot; isEqualToString:tag] &amp;&amp; ![@&quot;UL&quot; isEqualToString:tag] &amp;&amp; ![@&quot;OL&quot; isEqualToString:tag]))
</span><del>-            [self _newParagraphForElement:element tag:tag allowEmpty:NO suppressTrailingSpace:YES];
</del><ins>+            _newParagraphForElement(element, tag, NO, YES);
</ins><span class="cx">         return YES;
</span><span class="cx">     }
</span><span class="cx">     return NO;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_addTableForElement:(DOMElement *)tableElement
</del><ins>+void HTMLConverter::_addTableForElement(DOMElement *tableElement)
</ins><span class="cx"> {
</span><span class="cx">     RetainPtr&lt;NSTextTable&gt; table = adoptNS([[PlatformNSTextTable alloc] init]);
</span><span class="cx">     CGFloat cellSpacingVal = 1;
</span><span class="lines">@@ -1734,24 +1801,28 @@
</span><span class="cx">     [table setCollapsesBorders:NO];
</span><span class="cx">     [table setHidesEmptyCells:NO];
</span><span class="cx">     if (tableElement) {
</span><del>-        NSString *borderCollapse = [self _stringForNode:tableElement property:CSSPropertyBorderCollapse];
-        NSString *emptyCells = [self _stringForNode:tableElement property:CSSPropertyEmptyCells];
-        NSString *tableLayout = [self _stringForNode:tableElement property:CSSPropertyTableLayout];
</del><ins>+        NSString *borderCollapse = _stringForNode(tableElement, CSSPropertyBorderCollapse);
+        NSString *emptyCells = _stringForNode(tableElement, CSSPropertyEmptyCells);
+        NSString *tableLayout = _stringForNode(tableElement, CSSPropertyTableLayout);
</ins><span class="cx">         if ([tableElement respondsToSelector:@selector(cellSpacing)]) {
</span><span class="cx">             NSString *cellSpacing = [(DOMHTMLTableElement *)tableElement cellSpacing];
</span><del>-            if (cellSpacing &amp;&amp; [cellSpacing length] &gt; 0 &amp;&amp; ![cellSpacing hasSuffix:@&quot;%&quot;]) cellSpacingVal = [cellSpacing floatValue];
</del><ins>+            if (cellSpacing &amp;&amp; [cellSpacing length] &gt; 0 &amp;&amp; ![cellSpacing hasSuffix:@&quot;%&quot;])
+                cellSpacingVal = [cellSpacing floatValue];
</ins><span class="cx">         }
</span><span class="cx">         if ([tableElement respondsToSelector:@selector(cellPadding)]) {
</span><span class="cx">             NSString *cellPadding = [(DOMHTMLTableElement *)tableElement cellPadding];
</span><del>-            if (cellPadding &amp;&amp; [cellPadding length] &gt; 0 &amp;&amp; ![cellPadding hasSuffix:@&quot;%&quot;]) cellPaddingVal = [cellPadding floatValue];
</del><ins>+            if (cellPadding &amp;&amp; [cellPadding length] &gt; 0 &amp;&amp; ![cellPadding hasSuffix:@&quot;%&quot;])
+                cellPaddingVal = [cellPadding floatValue];
</ins><span class="cx">         }
</span><del>-        [self _fillInBlock:table.get() forElement:tableElement backgroundColor:nil extraMargin:0 extraPadding:0 isTable:YES];
</del><ins>+        _fillInBlock(table.get(), tableElement, nil, 0, 0, YES);
</ins><span class="cx">         if ([@&quot;collapse&quot; isEqualToString:borderCollapse]) {
</span><span class="cx">             [table setCollapsesBorders:YES];
</span><span class="cx">             cellSpacingVal = 0;
</span><span class="cx">         }
</span><del>-        if ([@&quot;hide&quot; isEqualToString:emptyCells]) [table setHidesEmptyCells:YES];
-        if ([@&quot;fixed&quot; isEqualToString:tableLayout]) [table setLayoutAlgorithm:NSTextTableFixedLayoutAlgorithm];
</del><ins>+        if ([@&quot;hide&quot; isEqualToString:emptyCells])
+            [table setHidesEmptyCells:YES];
+        if ([@&quot;fixed&quot; isEqualToString:tableLayout])
+            [table setLayoutAlgorithm:NSTextTableFixedLayoutAlgorithm];
</ins><span class="cx">     }
</span><span class="cx">     [_textTables addObject:table.get()];
</span><span class="cx">     [_textTableSpacings addObject:[NSNumber numberWithDouble:cellSpacingVal]];
</span><span class="lines">@@ -1760,7 +1831,7 @@
</span><span class="cx">     [_textTableRowArrays addObject:[NSMutableArray array]];
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_addTableCellForElement:(DOMElement *)tableCellElement
</del><ins>+void HTMLConverter::_addTableCellForElement(DOMElement *tableCellElement)
</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">@@ -1792,8 +1863,8 @@
</span><span class="cx">     }
</span><span class="cx">     RetainPtr&lt;NSTextTableBlock&gt; block = adoptNS([[PlatformNSTextTableBlock alloc] initWithTable:table startingRow:rowNumber rowSpan:rowSpan startingColumn:columnNumber columnSpan:colSpan]);
</span><span class="cx">     if (tableCellElement) {
</span><del>-        NSString *verticalAlign = [self _stringForNode:tableCellElement property:CSSPropertyVerticalAlign];
-        [self _fillInBlock:block.get() forElement:tableCellElement backgroundColor:color extraMargin:cellSpacingVal / 2 extraPadding:0 isTable:NO];
</del><ins>+        NSString *verticalAlign = _stringForNode(tableCellElement, CSSPropertyVerticalAlign);
+        _fillInBlock(block.get(), tableCellElement, color, cellSpacingVal / 2, 0, NO);
</ins><span class="cx">         if ([@&quot;middle&quot; isEqualToString:verticalAlign])
</span><span class="cx">             [block setVerticalAlignment:NSTextBlockMiddleAlignment];
</span><span class="cx">         else if ([@&quot;bottom&quot; isEqualToString:verticalAlign])
</span><span class="lines">@@ -1808,23 +1879,23 @@
</span><span class="cx">     [rowArray sortUsingFunction:_colCompare context:NULL];
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (BOOL)_processElement:(DOMElement *)element tag:(NSString *)tag display:(NSString *)displayVal depth:(NSInteger)depth
</del><ins>+BOOL HTMLConverter::_processElement(DOMElement *element, NSString *tag, NSString *displayVal, NSInteger depth)
</ins><span class="cx"> {
</span><span class="cx">     BOOL retval = YES;
</span><del>-    BOOL isBlockLevel = [self _elementIsBlockLevel:element];
</del><ins>+    BOOL isBlockLevel = _elementIsBlockLevel(element);
</ins><span class="cx">     if (isBlockLevel)
</span><span class="cx">         [_writingDirectionArray removeAllObjects];
</span><span class="cx">     else {
</span><del>-        NSString *bidi = [self _stringForNode:element property:CSSPropertyUnicodeBidi];
</del><ins>+        NSString *bidi = _stringForNode(element, CSSPropertyUnicodeBidi);
</ins><span class="cx">         if (bidi &amp;&amp; [bidi isEqualToString:@&quot;embed&quot;]) {
</span><span class="cx">             NSUInteger val = NSTextWritingDirectionEmbedding;
</span><del>-            NSString *direction = [self _stringForNode:element property:CSSPropertyDirection];
</del><ins>+            NSString *direction = _stringForNode(element, CSSPropertyDirection);
</ins><span class="cx">             if ([direction isEqualToString:@&quot;rtl&quot;])
</span><span class="cx">                 val |= NSWritingDirectionRightToLeft;
</span><span class="cx">             [_writingDirectionArray addObject:[NSNumber numberWithUnsignedInteger:val]];
</span><span class="cx">         } else if (bidi &amp;&amp; [bidi isEqualToString:@&quot;bidi-override&quot;]) {
</span><span class="cx">             NSUInteger val = NSTextWritingDirectionOverride;
</span><del>-            NSString *direction = [self _stringForNode:element property:CSSPropertyDirection];
</del><ins>+            NSString *direction = _stringForNode(element, CSSPropertyDirection);
</ins><span class="cx">             if ([direction isEqualToString:@&quot;rtl&quot;])
</span><span class="cx">                 val |= NSWritingDirectionRightToLeft;
</span><span class="cx">             [_writingDirectionArray addObject:[NSNumber numberWithUnsignedInteger:val]];
</span><span class="lines">@@ -1834,25 +1905,24 @@
</span><span class="cx">         DOMElement *tableElement = element;
</span><span class="cx">         if ([@&quot;table-row-group&quot; isEqualToString:displayVal]) {
</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 = [self _blockLevelElementForNode:[element parentNode]];
-            if (![@&quot;table&quot; isEqualToString:[self _stringForNode:tableElement property:CSSPropertyDisplay]])
</del><ins>+            tableElement = _blockLevelElementForNode([element parentNode]);
+            if (![@&quot;table&quot; isEqualToString:_stringForNode(tableElement, CSSPropertyDisplay)])
</ins><span class="cx">                 tableElement = element;
</span><span class="cx">         }
</span><span class="cx">         while ([_textTables count] &gt; [_textBlocks count])
</span><del>-            [self _addTableCellForElement:nil];
-        [self _addTableForElement:tableElement];
</del><ins>+            _addTableCellForElement(nil);
+        _addTableForElement(tableElement);
</ins><span class="cx">     } else if ([@&quot;table-footer-group&quot; isEqualToString:displayVal] &amp;&amp; [_textTables count] &gt; 0) {
</span><span class="cx">         [_textTableFooters setObject:element forKey:[NSValue valueWithNonretainedObject:[_textTables lastObject]]];
</span><span class="cx">         retval = NO;
</span><span class="cx">     } else if ([@&quot;table-row&quot; isEqualToString:displayVal] &amp;&amp; [_textTables count] &gt; 0) {
</span><del>-        PlatformColor *color = [self _colorForNode:element property:CSSPropertyBackgroundColor];
</del><ins>+        PlatformColor *color = _colorForNode(element, CSSPropertyBackgroundColor);
</ins><span class="cx">         if (!color) color = [PlatformColorClass clearColor];
</span><span class="cx">         [_textTableRowBackgroundColors addObject:color];
</span><span class="cx">     } else if ([@&quot;table-cell&quot; isEqualToString:displayVal]) {
</span><del>-        while ([_textTables count] &lt; [_textBlocks count] + 1) {
-            [self _addTableForElement:nil];
-        }
-        [self _addTableCellForElement:element];
</del><ins>+        while ([_textTables count] &lt; [_textBlocks count] + 1)
+            _addTableForElement(nil);
+        _addTableCellForElement(element);
</ins><span class="cx">     } else if ([@&quot;IMG&quot; isEqualToString:tag]) {
</span><span class="cx">         NSString *urlString = [element getAttribute:@&quot;src&quot;];
</span><span class="cx">         if (urlString &amp;&amp; [urlString length] &gt; 0) {
</span><span class="lines">@@ -1864,7 +1934,7 @@
</span><span class="cx">             BOOL usePlaceholderImage = YES;
</span><span class="cx"> #endif
</span><span class="cx">             if (url)
</span><del>-                [self _addAttachmentForElement:element URL:url needsParagraph:isBlockLevel usePlaceholder:usePlaceholderImage];
</del><ins>+                _addAttachmentForElement(element, url, isBlockLevel, usePlaceholderImage);
</ins><span class="cx">         }
</span><span class="cx">         retval = NO;
</span><span class="cx">     } else if ([@&quot;OBJECT&quot; isEqualToString:tag]) {
</span><span class="lines">@@ -1882,50 +1952,51 @@
</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 = core([element ownerDocument])-&gt;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><del>-                retval = ![self _addAttachmentForElement:element URL:url needsParagraph:isBlockLevel usePlaceholder:NO];
</del><ins>+                retval = !_addAttachmentForElement(element, url, isBlockLevel, NO);
</ins><span class="cx">         }
</span><span class="cx">     } else if ([@&quot;FRAME&quot; isEqualToString:tag]) {
</span><span class="cx">         if ([element respondsToSelector:@selector(contentDocument)]) {
</span><span class="cx">             DOMDocument *contentDocument = [(DOMHTMLFrameElement *)element contentDocument];
</span><span class="cx">             if (contentDocument)
</span><del>-                [self _traverseNode:contentDocument depth:depth + 1 embedded:YES];
</del><ins>+                _traverseNode(contentDocument, depth + 1, YES);
</ins><span class="cx">         }
</span><span class="cx">         retval = NO;
</span><span class="cx">     } else if ([@&quot;IFRAME&quot; isEqualToString:tag]) {
</span><span class="cx">         if ([element respondsToSelector:@selector(contentDocument)]) {
</span><span class="cx">             DOMDocument *contentDocument = [(DOMHTMLIFrameElement *)element contentDocument];
</span><span class="cx">             if (contentDocument) {
</span><del>-                [self _traverseNode:contentDocument depth:depth + 1 embedded:YES];
</del><ins>+                _traverseNode(contentDocument, depth + 1, YES);
</ins><span class="cx">                 retval = NO;
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     } else if ([@&quot;BR&quot; isEqualToString:tag]) {
</span><del>-        DOMElement *blockElement = [self _blockLevelElementForNode:[element parentNode]];
</del><ins>+        DOMElement *blockElement = _blockLevelElementForNode([element parentNode]);
</ins><span class="cx">         NSString *breakClass = [element getAttribute:@&quot;class&quot;], *blockTag = [blockElement tagName];
</span><span class="cx">         BOOL isExtraBreak = [@&quot;Apple-interchange-newline&quot; isEqualToString:breakClass], blockElementIsParagraph = ([@&quot;P&quot; isEqualToString:blockTag] || [@&quot;LI&quot; isEqualToString:blockTag] || ([blockTag hasPrefix:@&quot;H&quot;] &amp;&amp; 2 == [blockTag length]));
</span><span class="cx">         if (isExtraBreak)
</span><span class="cx">             _flags.hasTrailingNewline = YES;
</span><span class="cx">         else {
</span><span class="cx">             if (blockElement &amp;&amp; blockElementIsParagraph)
</span><del>-                [self _newLineForElement:element];
</del><ins>+                _newLineForElement(element);
</ins><span class="cx">             else
</span><del>-                [self _newParagraphForElement:element tag:tag allowEmpty:YES suppressTrailingSpace:NO];
</del><ins>+                _newParagraphForElement(element, tag, YES, NO);
</ins><span class="cx">         }
</span><span class="cx">     } else if ([@&quot;UL&quot; isEqualToString:tag]) {
</span><span class="cx">         RetainPtr&lt;NSTextList&gt; list;
</span><del>-        NSString *listStyleType = [self _stringForNode:element property:CSSPropertyListStyleType];
</del><ins>+        NSString *listStyleType = _stringForNode(element, CSSPropertyListStyleType);
</ins><span class="cx">         if (!listStyleType || [listStyleType length] == 0)
</span><span class="cx">             listStyleType = @&quot;disc&quot;;
</span><span class="cx">         list = adoptNS([[PlatformNSTextList alloc] initWithMarkerFormat:[NSString stringWithFormat:@&quot;{%@}&quot;, listStyleType] options:0]);
</span><span class="cx">         [_textLists addObject:list.get()];
</span><span class="cx">     } else if ([@&quot;OL&quot; isEqualToString:tag]) {
</span><span class="cx">         RetainPtr&lt;NSTextList&gt; list;
</span><del>-        NSString *listStyleType = [self _stringForNode:element property:CSSPropertyListStyleType];
-        if (!listStyleType || [listStyleType length] == 0) listStyleType = @&quot;decimal&quot;;
</del><ins>+        NSString *listStyleType = _stringForNode(element, CSSPropertyListStyleType);
+        if (!listStyleType || [listStyleType length] == 0)
+            listStyleType = @&quot;decimal&quot;;
</ins><span class="cx">         list = adoptNS([[PlatformNSTextList alloc] initWithMarkerFormat:[NSString stringWithFormat:@&quot;{%@}.&quot;, listStyleType] options:0]);
</span><span class="cx">         if ([element respondsToSelector:@selector(start)]) {
</span><span class="cx">             NSInteger startingItemNumber = [(DOMHTMLOListElement *)element start];
</span><span class="lines">@@ -1933,23 +2004,25 @@
</span><span class="cx">         }
</span><span class="cx">         [_textLists addObject:list.get()];
</span><span class="cx">     } else if ([@&quot;Q&quot; isEqualToString:tag]) {
</span><del>-        [self _addQuoteForElement:element opening:YES level:_quoteLevel++];
</del><ins>+        _addQuoteForElement(element, YES, _quoteLevel++);
</ins><span class="cx">     } else if ([@&quot;INPUT&quot; isEqualToString:tag]) {
</span><span class="cx">         if ([element respondsToSelector:@selector(type)] &amp;&amp; [element respondsToSelector:@selector(value)] &amp;&amp; [@&quot;text&quot; compare:[(DOMHTMLInputElement *)element type] options:NSCaseInsensitiveSearch] == NSOrderedSame) {
</span><span class="cx">             NSString *value = [(DOMHTMLInputElement *)element value];
</span><del>-            if (value &amp;&amp; [value length] &gt; 0) [self _addValue:value forElement:element];
</del><ins>+            if (value &amp;&amp; [value length] &gt; 0)
+                _addValue(value, element);
</ins><span class="cx">         }
</span><span class="cx">     } else if ([@&quot;TEXTAREA&quot; isEqualToString:tag]) {
</span><span class="cx">         if ([element respondsToSelector:@selector(value)]) {
</span><span class="cx">             NSString *value = [(DOMHTMLTextAreaElement *)element value];
</span><del>-            if (value &amp;&amp; [value length] &gt; 0) [self _addValue:value forElement:element];
</del><ins>+            if (value &amp;&amp; [value length] &gt; 0)
+                _addValue(value, element);
</ins><span class="cx">         }
</span><span class="cx">         retval = NO;
</span><span class="cx">     }
</span><span class="cx">     return retval;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_addMarkersToList:(NSTextList *)list range:(NSRange)range
</del><ins>+void HTMLConverter::_addMarkersToList(NSTextList *list, NSRange range)
</ins><span class="cx"> {
</span><span class="cx">     NSInteger itemNum = [list startingItemNumber];
</span><span class="cx">     NSString *string = [_attrStr string];
</span><span class="lines">@@ -1989,11 +2062,10 @@
</span><span class="cx">                 if ([[paragraphStyle textLists] count] == listIndex + 1) {
</span><span class="cx">                     stringToInsert = [NSString stringWithFormat:@&quot;\t%@\t&quot;, [list markerForItemNumber:itemNum++]];
</span><span class="cx">                     insertLength = [stringToInsert length];
</span><del>-                    if (!_flags.isIndexing &amp;&amp; !_flags.isTesting)
-                        attrsToInsert = [PlatformNSTextList _standardMarkerAttributesForAttributes:[_attrStr attributesAtIndex:paragraphRange.location effectiveRange:NULL]];
</del><ins>+                    attrsToInsert = [PlatformNSTextList _standardMarkerAttributesForAttributes:[_attrStr attributesAtIndex:paragraphRange.location effectiveRange:NULL]];
</ins><span class="cx"> 
</span><span class="cx">                     [_attrStr replaceCharactersInRange:NSMakeRange(paragraphRange.location, 0) withString:stringToInsert];
</span><del>-                    if (!_flags.isIndexing &amp;&amp; !_flags.isTesting) [_attrStr setAttributes:attrsToInsert range:NSMakeRange(paragraphRange.location, insertLength)];
</del><ins>+                    [_attrStr setAttributes:attrsToInsert range:NSMakeRange(paragraphRange.location, insertLength)];
</ins><span class="cx">                     range.length += insertLength;
</span><span class="cx">                     paragraphRange.length += insertLength;
</span><span class="cx">                     if (paragraphRange.location &lt; _domRangeStartIndex) _domRangeStartIndex += insertLength;
</span><span class="lines">@@ -2006,9 +2078,13 @@
</span><span class="cx">                     while ((count = [[newStyle tabStops] count]) &gt; 0) {
</span><span class="cx">                         for (i = 0, tabToRemove = nil; !tabToRemove &amp;&amp; i &lt; count; i++) {
</span><span class="cx">                             tab = [[newStyle tabStops] objectAtIndex:i];
</span><del>-                            if ([tab location] &lt;= listLocation) tabToRemove = tab;
</del><ins>+                            if ([tab location] &lt;= listLocation)
+                                tabToRemove = tab;
</ins><span class="cx">                         }
</span><del>-                        if (tabToRemove) [newStyle removeTabStop:tab]; else break;
</del><ins>+                        if (tabToRemove)
+                            [newStyle removeTabStop:tab];
+                        else
+                            break;
</ins><span class="cx">                     }
</span><span class="cx">                     tab = [[PlatformNSTextTab alloc] initWithType:NSLeftTabStopType location:markerLocation];
</span><span class="cx">                     [newStyle addTabStop:tab];
</span><span class="lines">@@ -2020,7 +2096,7 @@
</span><span class="cx"> #endif
</span><span class="cx">                     [newStyle addTabStop:tab];
</span><span class="cx">                     [tab release];
</span><del>-                    if (!_flags.isIndexing &amp;&amp; !_flags.isTesting) [_attrStr addAttribute:NSParagraphStyleAttributeName value:newStyle range:paragraphRange];
</del><ins>+                    [_attrStr addAttribute:NSParagraphStyleAttributeName value:newStyle range:paragraphRange];
</ins><span class="cx">                     [newStyle release];
</span><span class="cx">                     
</span><span class="cx">                     idx = NSMaxRange(paragraphRange);
</span><span class="lines">@@ -2033,7 +2109,7 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_exitElement:(DOMElement *)element tag:(NSString *)tag display:(NSString *)displayVal depth:(NSInteger)depth startIndex:(NSUInteger)startIndex
</del><ins>+void HTMLConverter::_exitElement(DOMElement *element, NSString *tag, NSString *displayVal, NSInteger depth, NSUInteger startIndex)
</ins><span class="cx"> {
</span><span class="cx">     NSRange range = NSMakeRange(startIndex, [_attrStr length] - startIndex);
</span><span class="cx">     if (range.length &gt; 0 &amp;&amp; [@&quot;A&quot; isEqualToString:tag]) {
</span><span class="lines">@@ -2045,21 +2121,20 @@
</span><span class="cx">                 url = core([element ownerDocument])-&gt;completeURL(stripLeadingAndTrailingHTMLSpaces(strippedString));
</span><span class="cx">             if (!url)
</span><span class="cx">                 url = [NSURL _web_URLWithString:strippedString relativeToURL:_baseURL];
</span><del>-            if (!_flags.isIndexing &amp;&amp; !_flags.isTesting)
-                [_attrStr addAttribute:NSLinkAttributeName value:url ? (id)url : (id)urlString range:range];
</del><ins>+            [_attrStr addAttribute:NSLinkAttributeName value:url ? (id)url : (id)urlString range:range];
</ins><span class="cx">         }
</span><span class="cx">     }
</span><del>-    if (!_flags.reachedEnd &amp;&amp; [self _elementIsBlockLevel:element]) {
</del><ins>+    if (!_flags.reachedEnd &amp;&amp; _elementIsBlockLevel(element)) {
</ins><span class="cx">         [_writingDirectionArray removeAllObjects];
</span><span class="cx">         if ([@&quot;table-cell&quot; isEqualToString:displayVal] &amp;&amp; [_textBlocks count] == 0) {
</span><del>-            [self _newTabForElement:element];
</del><ins>+            _newTabForElement(element);
</ins><span class="cx">         } else if ([_textLists count] &gt; 0 &amp;&amp; [@&quot;block&quot; isEqualToString:displayVal] &amp;&amp; ![@&quot;LI&quot; isEqualToString:tag] &amp;&amp; ![@&quot;UL&quot; isEqualToString:tag] &amp;&amp; ![@&quot;OL&quot; isEqualToString:tag]) {
</span><del>-            [self _newLineForElement:element];
</del><ins>+            _newLineForElement(element);
</ins><span class="cx">         } else {
</span><del>-            [self _newParagraphForElement:element tag:tag allowEmpty:(range.length == 0) suppressTrailingSpace:YES];
</del><ins>+            _newParagraphForElement(element, tag, (range.length == 0), YES);
</ins><span class="cx">         }
</span><span class="cx">     } else if ([_writingDirectionArray count] &gt; 0) {
</span><del>-        NSString *bidi = [self _stringForNode:element property:CSSPropertyUnicodeBidi];
</del><ins>+        NSString *bidi = _stringForNode(element, CSSPropertyUnicodeBidi);
</ins><span class="cx">         if (bidi &amp;&amp; ([bidi isEqualToString:@&quot;embed&quot;] || [bidi isEqualToString:@&quot;bidi-override&quot;])) {
</span><span class="cx">             [_writingDirectionArray removeLastObject];
</span><span class="cx">         }
</span><span class="lines">@@ -2071,7 +2146,7 @@
</span><span class="cx">         while ([_textTables count] &lt; [_textBlocks count] + 1)
</span><span class="cx">             [_textBlocks removeLastObject];
</span><span class="cx">         if (footer) {
</span><del>-            [self _traverseFooterNode:footer depth:depth + 1];
</del><ins>+            _traverseFooterNode(footer, depth + 1);
</ins><span class="cx">             [_textTableFooters removeObjectForKey:key];
</span><span class="cx">         }
</span><span class="cx">         [_textTables removeLastObject];
</span><span class="lines">@@ -2123,10 +2198,10 @@
</span><span class="cx">         [_textBlocks removeLastObject];
</span><span class="cx">     } else if (([@&quot;UL&quot; isEqualToString:tag] || [@&quot;OL&quot; isEqualToString:tag]) &amp;&amp; [_textLists count] &gt; 0) {
</span><span class="cx">         NSTextList *list = [_textLists lastObject];
</span><del>-        [self _addMarkersToList:list range:range];
</del><ins>+        _addMarkersToList(list, range);
</ins><span class="cx">         [_textLists removeLastObject];
</span><span class="cx">     } else if ([@&quot;Q&quot; isEqualToString:tag]) {
</span><del>-        [self _addQuoteForElement:element opening:NO level:--_quoteLevel];
</del><ins>+        _addQuoteForElement(element, NO, --_quoteLevel);
</ins><span class="cx">     } else if ([@&quot;SPAN&quot; isEqualToString:tag]) {
</span><span class="cx">         NSString *className = [element getAttribute:@&quot;class&quot;];
</span><span class="cx">         NSMutableString *mutableString;
</span><span class="lines">@@ -2168,7 +2243,7 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_processText:(DOMCharacterData *)text
</del><ins>+void HTMLConverter::_processText(DOMCharacterData *text)
</ins><span class="cx"> {
</span><span class="cx">     NSString *instr = [text data];
</span><span class="cx">     NSString *outstr = instr;
</span><span class="lines">@@ -2183,8 +2258,8 @@
</span><span class="cx">     BOOL suppressLeadingSpace = ((_flags.isSoft &amp;&amp; lastChar == ' ') || lastChar == '\n' || lastChar == '\r' || lastChar == '\t' || lastChar == NSParagraphSeparatorCharacter || lastChar == NSLineSeparatorCharacter || lastChar == NSFormFeedCharacter || lastChar == WebNextLineCharacter);
</span><span class="cx">     NSRange rangeToReplace = NSMakeRange(textLength, 0);
</span><span class="cx">     CFMutableStringRef mutstr = NULL;
</span><del>-    whitespaceVal = [self _stringForNode:text property:CSSPropertyWhiteSpace];
-    transformVal = [self _stringForNode:text property:CSSPropertyTextTransform];
</del><ins>+    whitespaceVal = _stringForNode(text, CSSPropertyWhiteSpace);
+    transformVal = _stringForNode(text, CSSPropertyTextTransform);
</ins><span class="cx">     
</span><span class="cx">     if (_domRange) {
</span><span class="cx">         if (text == [_domRange startContainer]) {
</span><span class="lines">@@ -2246,31 +2321,29 @@
</span><span class="cx">             outstr = [outstr lowercaseString];
</span><span class="cx">         [_attrStr replaceCharactersInRange:rangeToReplace withString:outstr];
</span><span class="cx">         rangeToReplace.length = [outstr length];
</span><del>-        if (!_flags.isIndexing) {
-            RetainPtr&lt;NSDictionary&gt; attrs;
-            DOMElement *element = (DOMElement *)text;
-            while (element) {
-                // Fill attrs dictionary with attributes from parent nodes, not overwriting ones deeper in the tree
-                if([element nodeType] == DOM_ELEMENT_NODE) {
-                    RetainPtr&lt;NSMutableDictionary&gt; newAttrs = adoptNS([[self _attributesForElement:element] mutableCopy]);
-                    if (attrs) {
-                        // Already-set attributes (from lower in the tree) overwrite the higher ones.
-                        [newAttrs addEntriesFromDictionary:attrs.get()];
-                    }
-                    attrs = newAttrs;
</del><ins>+        RetainPtr&lt;NSDictionary&gt; attrs;
+        DOMElement *element = (DOMElement *)text;
+        while (element) {
+            // Fill attrs dictionary with attributes from parent nodes, not overwriting ones deeper in the tree
+            if([element nodeType] == DOM_ELEMENT_NODE) {
+                RetainPtr&lt;NSMutableDictionary&gt; newAttrs = adoptNS([_attributesForElement(element) mutableCopy]);
+                if (attrs) {
+                    // Already-set attributes (from lower in the tree) overwrite the higher ones.
+                    [newAttrs addEntriesFromDictionary:attrs.get()];
</ins><span class="cx">                 }
</span><del>-                element = (DOMElement *)[element parentNode];
</del><ins>+                attrs = newAttrs;
</ins><span class="cx">             }
</span><del>-            if (!_flags.isTesting &amp;&amp; rangeToReplace.length &gt; 0)
-                [_attrStr setAttributes:attrs.get() range:rangeToReplace];
</del><ins>+            element = (DOMElement *)[element parentNode];
</ins><span class="cx">         }
</span><ins>+        if (rangeToReplace.length &gt; 0)
+            [_attrStr setAttributes:attrs.get() range:rangeToReplace];
</ins><span class="cx">         _flags.isSoft = wasSpace;
</span><span class="cx">     }
</span><span class="cx">     if (mutstr)
</span><span class="cx">         CFRelease(mutstr);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_traverseNode:(DOMNode *)node depth:(NSInteger)depth embedded:(BOOL)embedded
</del><ins>+void HTMLConverter::_traverseNode(DOMNode *node, NSInteger depth, BOOL embedded)
</ins><span class="cx"> {
</span><span class="cx">     unsigned short nodeType;
</span><span class="cx">     NSArray *childNodes;
</span><span class="lines">@@ -2286,7 +2359,7 @@
</span><span class="cx">         return;
</span><span class="cx">     
</span><span class="cx">     nodeType = [node nodeType];
</span><del>-    childNodes = [self _childrenForNode:node];
</del><ins>+    childNodes = _childrenForNode(node);
</ins><span class="cx">     count = [childNodes count];
</span><span class="cx">     startOffset = 0;
</span><span class="cx">     endOffset = count;
</span><span class="lines">@@ -2308,43 +2381,43 @@
</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>-                [self _traverseNode:[childNodes objectAtIndex:i] depth:depth + 1 embedded:embedded];
</del><ins>+                _traverseNode([childNodes objectAtIndex:i], depth + 1, embedded);
</ins><span class="cx">             if (isEnd &amp;&amp; i + 1 &gt;= endOffset)
</span><span class="cx">                 _flags.reachedEnd = YES;
</span><del>-            if (_thumbnailLimit &gt; 0 &amp;&amp; [_attrStr length] &gt;= _thumbnailLimit)
-                _flags.reachedEnd = YES;
</del><span class="cx">             if (_flags.reachedEnd) break;
</span><span class="cx">         }
</span><span class="cx">     } else if (nodeType == DOM_ELEMENT_NODE) {
</span><span class="cx">         DOMElement *element = (DOMElement *)node;
</span><del>-        NSString *tag = [element tagName], *displayVal = [self _stringForNode:element property:CSSPropertyDisplay];
-        if ([self _enterElement:element tag:tag display:displayVal embedded:embedded]) {
</del><ins>+        NSString *tag = [element tagName];
+        NSString *displayVal = _stringForNode(element, CSSPropertyDisplay);
+        if (_enterElement(element, tag, displayVal, embedded)) {
</ins><span class="cx">             NSUInteger startIndex = [_attrStr length];
</span><del>-            if ([self _processElement:element tag:tag display:displayVal depth:depth]) {
</del><ins>+            if (_processElement(element, tag, displayVal, depth)) {
</ins><span class="cx">                 for (NSUInteger i = 0; i &lt; count; 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>-                        [self _traverseNode:[childNodes objectAtIndex:i] depth:depth + 1 embedded:embedded];
</del><ins>+                        _traverseNode([childNodes objectAtIndex:i], 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">                 }
</span><del>-                [self _exitElement:element tag:tag display:displayVal depth:depth startIndex:startIndex];
</del><ins>+                _exitElement(element, tag, displayVal, depth, startIndex);
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     } else if (nodeType == DOM_TEXT_NODE || nodeType == DOM_CDATA_SECTION_NODE) {
</span><del>-        [self _processText:(DOMCharacterData *)node];
</del><ins>+        _processText((DOMCharacterData *)node);
</ins><span class="cx">     }
</span><span class="cx">     
</span><del>-    if (isEnd) _flags.reachedEnd = YES;
</del><ins>+    if (isEnd)
+        _flags.reachedEnd = YES;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_traverseFooterNode:(DOMNode *)node depth:(NSInteger)depth
</del><ins>+void HTMLConverter::_traverseFooterNode(DOMNode *node, NSInteger depth)
</ins><span class="cx"> {
</span><span class="cx">     DOMElement *element = (DOMElement *)node;
</span><del>-    NSArray *childNodes = [self _childrenForNode:node];
</del><ins>+    NSArray *childNodes = _childrenForNode(node);
</ins><span class="cx">     NSString *tag = @&quot;TBODY&quot;, *displayVal = @&quot;table-row-group&quot;;
</span><span class="cx">     NSUInteger count = [childNodes count];
</span><span class="cx">     NSUInteger startOffset = 0;
</span><span class="lines">@@ -2367,27 +2440,27 @@
</span><span class="cx">             isEnd = YES;
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    if ([self _enterElement:element tag:tag display:displayVal embedded:YES]) {
</del><ins>+    if (_enterElement(element, tag, displayVal, YES)) {
</ins><span class="cx">         NSUInteger startIndex = [_attrStr length];
</span><del>-        if ([self _processElement:element tag:tag display:displayVal depth:depth]) {
</del><ins>+        if (_processElement(element, tag, displayVal, depth)) {
</ins><span class="cx">             for (NSUInteger i = 0; i &lt; count; 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>-                    [self _traverseNode:[childNodes objectAtIndex:i] depth:depth + 1 embedded:YES];
</del><ins>+                    _traverseNode([childNodes objectAtIndex:i], depth + 1, YES);
</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">             }
</span><del>-            [self _exitElement:element tag:tag display:displayVal depth:depth startIndex:startIndex];
</del><ins>+            _exitElement(element, tag, displayVal, depth, startIndex);
</ins><span class="cx">         }
</span><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)_adjustTrailingNewline
</del><ins>+void HTMLConverter::_adjustTrailingNewline()
</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] : 0;
</span><span class="lines">@@ -2396,7 +2469,7 @@
</span><span class="cx">         [_attrStr replaceCharactersInRange:NSMakeRange(textLength, 0) withString:@&quot;\n&quot;];
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)_loadFromDOMRange
</del><ins>+void HTMLConverter::_loadFromDOMRange()
</ins><span class="cx"> {
</span><span class="cx">     if (-1 == _errorCode) {
</span><span class="cx">         DOMNode *commonAncestorContainer = [_domRange commonAncestorContainer];
</span><span class="lines">@@ -2409,119 +2482,94 @@
</span><span class="cx">                 break;
</span><span class="cx">             ancestorContainer = [ancestorContainer parentNode];
</span><span class="cx">         }
</span><ins>+        
</ins><span class="cx">         _document = [commonAncestorContainer ownerDocument];
</span><span class="cx">         _dataSource = (DocumentLoader *)core(_document)-&gt;frame()-&gt;loader().documentLoader();
</span><del>-        if (_textSizeMultiplier &lt;= 0.0)
-            _textSizeMultiplier = 1;
-        if (_defaultFontSize &lt;= 0.0)
-            _defaultFontSize = 12;
-        if (_minimumFontSize &lt; 1.0)
-            _minimumFontSize = 1;
</del><ins>+        
</ins><span class="cx">         if (_document &amp;&amp; _dataSource) {
</span><span class="cx">             _domRangeStartIndex = 0;
</span><span class="cx">             _errorCode = 0;
</span><del>-            [self _traverseNode:commonAncestorContainer depth:0 embedded:NO];
</del><ins>+            _traverseNode(commonAncestorContainer, 0, NO);
</ins><span class="cx">             if (_domRangeStartIndex &gt; 0 &amp;&amp; _domRangeStartIndex &lt;= [_attrStr length])
</span><span class="cx">                 [_attrStr deleteCharactersInRange:NSMakeRange(0, _domRangeStartIndex)];
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (void)dealloc
-{
-    [_attrStr release];
-    [_documentAttrs release];
-    [_domRange release];
-    [_domStartAncestors release];
-    [_standardFontFamily release];
-    [_textLists release];
-    [_textBlocks release];
-    [_textTables release];
-    [_textTableFooters release];
-    [_textTableSpacings release];
-    [_textTablePaddings release];
-    [_textTableRows release];
-    [_textTableRowArrays release];
-    [_textTableRowBackgroundColors release];
-    [_attributesForElements release];
-    [_fontCache release];
-    [_writingDirectionArray release];
-    [super dealloc];
-}
</del><ins>+#if !PLATFORM(IOS)
</ins><span class="cx"> 
</span><del>-- (id)init
</del><ins>+static NSFileWrapper *fileWrapperForURL(DocumentLoader *dataSource, NSURL *URL)
</ins><span class="cx"> {
</span><del>-    self = [super init];
-    if (!self)
-        return nil;
-    
-    _attrStr = [[NSMutableAttributedString alloc] init];
-    _documentAttrs = [[NSMutableDictionary alloc] init];
</del><ins>+    if ([URL isFileURL])
+        return [[[NSFileWrapper alloc] initWithURL:[URL URLByResolvingSymlinksInPath] options:0 error:nullptr] autorelease];
</ins><span class="cx"> 
</span><del>-    _textLists = [[NSMutableArray alloc] init];
-    _textBlocks = [[NSMutableArray alloc] init];
-    _textTables = [[NSMutableArray alloc] init];
-    _textTableFooters = [[NSMutableDictionary alloc] init];
-    _textTableSpacings = [[NSMutableArray alloc] init];
-    _textTablePaddings = [[NSMutableArray alloc] init];
-    _textTableRows = [[NSMutableArray alloc] init];
-    _textTableRowArrays = [[NSMutableArray alloc] init];
-    _textTableRowBackgroundColors = [[NSMutableArray alloc] init];
-    _attributesForElements = [[NSMutableDictionary alloc] init];
-    _fontCache = [[NSMutableDictionary alloc] init];
-    _writingDirectionArray = [[NSMutableArray alloc] init];
-
-    _textSizeMultiplier = 1;
-    _webViewTextSizeMultiplier = 0;
-    _defaultTabInterval = 36;
-    _defaultFontSize = 12;
-    _minimumFontSize = 1;
-    _errorCode = -1;
-    _indexingLimit = 0;
-    _thumbnailLimit = 0;
</del><ins>+    RefPtr&lt;ArchiveResource&gt; resource = dataSource-&gt;subresource(URL);
+    if (resource) {
+        NSFileWrapper *wrapper = [[[NSFileWrapper alloc] initRegularFileWithContents:resource-&gt;data()-&gt;createNSData().get()] autorelease];
+        NSString *filename = resource-&gt;response().suggestedFilename();
+        if (!filename || ![filename length])
+            filename = suggestedFilenameWithMIMEType(resource-&gt;url(), resource-&gt;mimeType());
+        [wrapper setPreferredFilename:filename];
+        return wrapper;
+    }
</ins><span class="cx">     
</span><del>-    _caches = std::make_unique&lt;HTMLConverterCaches&gt;();
</del><ins>+    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:URL];
</ins><span class="cx"> 
</span><del>-    _flags.isIndexing = (_indexingLimit &gt; 0);
-    _flags.isTesting = 0;
</del><ins>+    NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
+    [request release];
</ins><span class="cx">     
</span><del>-    return self;
</del><ins>+    if (cachedResponse) {
+        NSFileWrapper *wrapper = [[[NSFileWrapper alloc] initRegularFileWithContents:[cachedResponse data]] autorelease];
+        [wrapper setPreferredFilename:[[cachedResponse response] suggestedFilename]];
+        return wrapper;
+    }
+    
+    return nil;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-- (id)initWithDOMRange:(DOMRange *)domRange
</del><ins>+static NSFileWrapper *fileWrapperForElement(Element* element)
</ins><span class="cx"> {
</span><del>-    self = [self init];
-    if (!self)
-        return nil;
-    _domRange = [domRange retain];
-    return self;
-}
</del><ins>+    NSFileWrapper *wrapper = nil;
+    
+    const AtomicString&amp; attr = element-&gt;getAttribute(srcAttr);
+    if (!attr.isEmpty()) {
+        NSURL *URL = element-&gt;document().completeURL(attr);
+        if (DocumentLoader* loader = element-&gt;document().loader())
+            wrapper = fileWrapperForURL(loader, URL);
+    }
+    if (!wrapper) {
+        RenderImage* renderer = toRenderImage(element-&gt;renderer());
+        if (renderer-&gt;cachedImage() &amp;&amp; !renderer-&gt;cachedImage()-&gt;errorOccurred()) {
+            wrapper = [[NSFileWrapper alloc] initRegularFileWithContents:(NSData *)(renderer-&gt;cachedImage()-&gt;imageForRenderer(renderer)-&gt;getTIFFRepresentation())];
+            [wrapper setPreferredFilename:@&quot;image.tiff&quot;];
+            [wrapper autorelease];
+        }
+    }
</ins><span class="cx"> 
</span><del>-- (NSAttributedString *)attributedString
-{
-    [self _loadFromDOMRange];
-    return (!_errorCode) ? [[_attrStr retain] autorelease] : nil;
</del><ins>+    return wrapper;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#endif
</ins><span class="cx"> 
</span><ins>+namespace WebCore {
+    
</ins><span class="cx"> // This function supports more HTML features than the editing variant below, such as tables.
</span><del>-+ (NSAttributedString *)attributedStringFromRange:(Range*)range
</del><ins>+NSAttributedString *attributedStringFromRange(Range&amp; range)
</ins><span class="cx"> {
</span><del>-    RetainPtr&lt;WebHTMLConverter&gt; converter = adoptNS([[WebHTMLConverter alloc] initWithDOMRange:kit(range)]);
-    return [converter attributedString];
</del><ins>+    HTMLConverter converter(kit(&amp;range));
+    return converter.convert();
</ins><span class="cx"> }
</span><del>-
</del><ins>+    
</ins><span class="cx"> #if !PLATFORM(IOS)
</span><del>-
</del><span class="cx"> // This function uses TextIterator, which makes offsets in its result compatible with HTML editing.
</span><del>-+ (NSAttributedString *)editingAttributedStringFromRange:(Range*)range
</del><ins>+NSAttributedString *editingAttributedStringFromRange(Range&amp; range)
</ins><span class="cx"> {
</span><span class="cx">     NSFontManager *fontManager = [NSFontManager sharedFontManager];
</span><span class="cx">     NSMutableAttributedString *string = [[NSMutableAttributedString alloc] init];
</span><span class="cx">     NSUInteger stringLength = 0;
</span><span class="cx">     RetainPtr&lt;NSMutableDictionary&gt; attrs = adoptNS([[NSMutableDictionary alloc] init]);
</span><span class="cx"> 
</span><del>-    for (TextIterator it(range); !it.atEnd(); it.advance()) {
</del><ins>+    for (TextIterator it(&amp;range); !it.atEnd(); it.advance()) {
</ins><span class="cx">         RefPtr&lt;Range&gt; currentTextRange = it.range();
</span><span class="cx">         Node* startContainer = currentTextRange-&gt;startContainer();
</span><span class="cx">         Node* endContainer = currentTextRange-&gt;endContainer();
</span><span class="lines">@@ -2571,78 +2619,6 @@
</span><span class="cx"> 
</span><span class="cx">     return [string autorelease];
</span><span class="cx"> }
</span><del>-
</del><span class="cx"> #endif
</span><del>-
-@end
-
-#if !PLATFORM(IOS)
-
-static NSFileWrapper *fileWrapperForURL(DocumentLoader *dataSource, NSURL *URL)
-{
-    if ([URL isFileURL])
-        return [[[NSFileWrapper alloc] initWithURL:[URL URLByResolvingSymlinksInPath] options:0 error:nullptr] autorelease];
-
-    RefPtr&lt;ArchiveResource&gt; resource = dataSource-&gt;subresource(URL);
-    if (resource) {
-        NSFileWrapper *wrapper = [[[NSFileWrapper alloc] initRegularFileWithContents:resource-&gt;data()-&gt;createNSData().get()] autorelease];
-        NSString *filename = resource-&gt;response().suggestedFilename();
-        if (!filename || ![filename length])
-            filename = suggestedFilenameWithMIMEType(resource-&gt;url(), resource-&gt;mimeType());
-        [wrapper setPreferredFilename:filename];
-        return wrapper;
-    }
</del><span class="cx">     
</span><del>-    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:URL];
-
-    NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
-    [request release];
-    
-    if (cachedResponse) {
-        NSFileWrapper *wrapper = [[[NSFileWrapper alloc] initRegularFileWithContents:[cachedResponse data]] autorelease];
-        [wrapper setPreferredFilename:[[cachedResponse response] suggestedFilename]];
-        return wrapper;
-    }
-    
-    return nil;
</del><span class="cx"> }
</span><del>-
-static NSFileWrapper *fileWrapperForElement(Element* element)
-{
-    NSFileWrapper *wrapper = nil;
-    
-    const AtomicString&amp; attr = element-&gt;getAttribute(srcAttr);
-    if (!attr.isEmpty()) {
-        NSURL *URL = element-&gt;document().completeURL(attr);
-        if (DocumentLoader* loader = element-&gt;document().loader())
-            wrapper = fileWrapperForURL(loader, URL);
-    }
-    if (!wrapper) {
-        RenderImage* renderer = toRenderImage(element-&gt;renderer());
-        if (renderer-&gt;cachedImage() &amp;&amp; !renderer-&gt;cachedImage()-&gt;errorOccurred()) {
-            wrapper = [[NSFileWrapper alloc] initRegularFileWithContents:(NSData *)(renderer-&gt;cachedImage()-&gt;imageForRenderer(renderer)-&gt;getTIFFRepresentation())];
-            [wrapper setPreferredFilename:@&quot;image.tiff&quot;];
-            [wrapper autorelease];
-        }
-    }
-
-    return wrapper;
-}
-
-#endif
-
-namespace WebCore {
-    
-NSAttributedString *attributedStringFromRange(Range&amp; range)
-{
-    return [WebHTMLConverter attributedStringFromRange:&amp;range];
-}
-    
-#if !PLATFORM(IOS)
-NSAttributedString *editingAttributedStringFromRange(Range&amp; range)
-{
-    return [WebHTMLConverter editingAttributedStringFromRange:&amp;range];
-}
-#endif
-    
-}
</del></span></pre>
</div>
</div>

</body>
</html>