<!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 <sam@webkit.org> 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 <sam@webkit.org>
+
+ 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 <jinwoo7.song@samsung.com>
</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&, 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<HTMLConverterCaches>();
+}
</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:@"com.apple.WebKit"];
</span><span class="cx"> if (!bundle)
</span><span class="cx"> bundle = [NSBundle bundleWithPath:[_NSSystemLibraryPath() stringByAppendingPathComponent:@"Frameworks/WebKit.framework"]];
</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("table");
</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 && _caches->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 && _caches->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 && [element nodeType] != DOM_ELEMENT_NODE)
</span><span class="cx"> element = (DOMElement *)[element parentNode];
</span><del>- if (element && ![self _elementIsBlockLevel:element])
- element = [self _blockLevelElementForNode:[element parentNode]];
</del><ins>+ if (element && !_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) < 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:&fontSize forNode:element property:CSSPropertyFontSize] || fontSize <= 0.0)
- fontSize = _defaultFontSize;
- fontSize *= _textSizeMultiplier;
- if (fontSize < _minimumFontSize) fontSize = _minimumFontSize;
</del><ins>+ if (!_getFloat(&fontSize, element, CSSPropertyFontSize) || fontSize <= 0.0)
+ fontSize = defaultFontSize;
+ if (fontSize < minimumFontSize)
+ fontSize = minimumFontSize;
</ins><span class="cx"> if (fabs(floor(2.0 * fontSize + 0.5) / 2.0 - fontSize) < 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) < 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 <= 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 && ![self _elementHasOwnBackgroundColor:element])
</del><ins>+ if (backgroundColor && !_elementHasOwnBackgroundColor(element))
</ins><span class="cx"> [attrs setObject:backgroundColor forKey:NSBackgroundColorAttributeName];
</span><span class="cx">
</span><del>- if ([self _getFloat:&strokeWidth forNode:element property:CSSPropertyWebkitTextStrokeWidth]) {
</del><ins>+ if (_getFloat(&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:@"none"].location != NSNotFound)
</span><span class="lines">@@ -1208,7 +1281,7 @@
</span><span class="cx"> if ([verticalAlign rangeOfString:@"sub"].location != NSNotFound)
</span><span class="cx"> [attrs setObject:[NSNumber numberWithInteger:-1] forKey:NSSuperscriptAttributeName];
</span><span class="cx"> }
</span><del>- if ([self _getFloat:&baselineOffset forNode:element property:CSSPropertyVerticalAlign])
</del><ins>+ if (_getFloat(&baselineOffset, element, CSSPropertyVerticalAlign))
</ins><span class="cx"> [attrs setObject:[NSNumber numberWithDouble:baselineOffset] forKey:NSBaselineOffsetAttributeName];
</span><span class="cx"> if (textShadow && [textShadow length] > 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 = ([@"P" isEqualToString:blockTag] || [@"LI" isEqualToString:blockTag] || ([blockTag hasPrefix:@"H"] && 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:@"left"])
</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:&leftMargin forNode:blockElement property:CSSPropertyMarginLeft] && leftMargin > 0.0)
</del><ins>+ if (_getFloat(&leftMargin, blockElement, CSSPropertyMarginLeft) && leftMargin > 0.0)
</ins><span class="cx"> [paragraphStyle setHeadIndent:leftMargin];
</span><del>- if ([self _getFloat:&textIndent forNode:blockElement property:CSSPropertyTextIndent])
</del><ins>+ if (_getFloat(&textIndent, blockElement, CSSPropertyTextIndent))
</ins><span class="cx"> [paragraphStyle setFirstLineHeadIndent:[paragraphStyle headIndent] + textIndent];
</span><del>- if ([self _getFloat:&rightMargin forNode:blockElement property:CSSPropertyMarginRight] && rightMargin > 0.0)
</del><ins>+ if (_getFloat(&rightMargin, blockElement, CSSPropertyMarginRight) && rightMargin > 0.0)
</ins><span class="cx"> [paragraphStyle setTailIndent:-rightMargin];
</span><del>- if ([self _getFloat:&bottomMargin forNode:blockElement property:CSSPropertyMarginBottom] && bottomMargin > 0.0)
</del><ins>+ if (_getFloat(&bottomMargin, blockElement, CSSPropertyMarginBottom) && bottomMargin > 0.0)
</ins><span class="cx"> [paragraphStyle setParagraphSpacing:bottomMargin];
</span><span class="cx"> }
</span><del>- if (_webViewTextSizeMultiplier > 0.0 && [self _getFloat:&lineHeight forNode:element property:CSSPropertyLineHeight] && lineHeight > 0.0)
- [paragraphStyle setMinimumLineHeight:lineHeight / _webViewTextSizeMultiplier];
</del><span class="cx"> if ([_textLists count] > 0)
</span><span class="cx"> [paragraphStyle setTextLists:_textLists];
</span><span class="cx"> if ([_textBlocks count] > 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 > 0) ? [[_attrStr string] characterAtIndex:textLength - 1] : '\n';
</span><del>- NSRange rangeToReplace = (suppress && _flags.isSoft && (lastChar == ' ' || lastChar == NSLineSeparatorCharacter)) ? NSMakeRange(textLength - 1, 1) : NSMakeRange(textLength, 0);
</del><ins>+ NSRange rangeToReplace = (suppressTrailingSpace && _flags.isSoft && (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 = (([@"BODY" isEqualToString:tag] || [@"HTML" isEqualToString:tag]) ? @"" : @"\n");
</span><span class="lines">@@ -1308,16 +1378,14 @@
</span><span class="cx"> if (rangeToReplace.location < _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 && rangeToReplace.length > 0)
- [_attrStr setAttributes:attrs range:rangeToReplace];
- }
</del><ins>+ NSDictionary *attrs = _attributesForElement(element);
+ if (rangeToReplace.length > 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<NSString> string = adoptNS([[NSString alloc] initWithCharacters:&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 < _domRangeStartIndex) _domRangeStartIndex += rangeToReplace.length;
- if (!_flags.isIndexing) {
- NSDictionary *attrs = [self _attributesForElement:element];
- if (!_flags.isTesting && rangeToReplace.length > 0)
- [_attrStr setAttributes:attrs range:rangeToReplace];
- }
</del><ins>+ if (rangeToReplace.location < _domRangeStartIndex)
+ _domRangeStartIndex += rangeToReplace.length;
+ NSDictionary *attrs = _attributesForElement(element);
+ if (rangeToReplace.length > 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 = @"\t";
</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 < _domRangeStartIndex)
</span><span class="cx"> _domRangeStartIndex += rangeToReplace.length;
</span><del>- if (!_flags.isIndexing) {
- NSDictionary *attrs = [self _attributesForElement:element];
- if (!_flags.isTesting && rangeToReplace.length > 0)
- [_attrStr setAttributes:attrs range:rangeToReplace];
- }
</del><ins>+ NSDictionary *attrs = _attributesForElement(element);
+ if (rangeToReplace.length > 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->loader().frameHasLoaded() ? frame->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->subresource(url);
</span><span class="cx">
</span><span class="cx"> const String& mimeType = resource->mimeType();
</span><del>- if (flag && resource && mimeType == "text/html")
</del><ins>+ if (usePlaceholder && resource && mimeType == "text/html")
</ins><span class="cx"> notFound = YES;
</span><span class="cx"> if (resource && !notFound) {
</span><span class="cx"> fileWrapper = [[[NSFileWrapper alloc] initRegularFileWithContents:resource->data()->createNSData().get()] autorelease];
</span><span class="lines">@@ -1397,18 +1460,22 @@
</span><span class="cx"> #if !PLATFORM(IOS)
</span><span class="cx"> if (!fileWrapper && !notFound) {
</span><span class="cx"> fileWrapper = fileWrapperForURL(dataSource, url);
</span><del>- if (flag && fileWrapper && [[[[fileWrapper preferredFilename] pathExtension] lowercaseString] hasPrefix:@"htm"]) notFound = YES;
- if (notFound) fileWrapper = nil;
</del><ins>+ if (usePlaceholder && fileWrapper && [[[[fileWrapper preferredFilename] pathExtension] lowercaseString] hasPrefix:@"htm"])
+ notFound = YES;
+ if (notFound)
+ fileWrapper = nil;
</ins><span class="cx"> }
</span><span class="cx"> if (!fileWrapper && !notFound) {
</span><span class="cx"> fileWrapper = fileWrapperForURL(_dataSource, url);
</span><del>- if (flag && fileWrapper && [[[[fileWrapper preferredFilename] pathExtension] lowercaseString] hasPrefix:@"htm"]) notFound = YES;
- if (notFound) fileWrapper = nil;
</del><ins>+ if (usePlaceholder && fileWrapper && [[[[fileWrapper preferredFilename] pathExtension] lowercaseString] hasPrefix:@"htm"])
+ notFound = YES;
+ if (notFound)
+ fileWrapper = nil;
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> if (!fileWrapper && !notFound && 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:&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<NSTextAttachment> 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<NSString> string = adoptNS([[NSString alloc] initWithFormat:(needsParagraph ? @"%C\n" : @"%C"), static_cast<unichar>(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:@"missing_image" withExtension:@"tiff"];
</del><ins>+ NSURL *missingImageURL = [_webKitBundle() URLForResource:@"missing_image" withExtension:@"tiff"];
</ins><span class="cx"> ASSERT_WITH_MESSAGE(missingImageURL != nil, "Unable to find missing_image.tiff!");
</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 < _domRangeStartIndex)
</span><span class="cx"> _domRangeStartIndex += rangeToReplace.length;
</span><del>- attrs = [self _attributesForElement:element];
- if (!_flags.isTesting && rangeToReplace.length > 0) {
</del><ins>+ attrs = _attributesForElement(element);
+ if (rangeToReplace.length > 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<NSString> string = adoptNS([[NSString alloc] initWithCharacters:&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 < _domRangeStartIndex)
</span><span class="cx"> _domRangeStartIndex += rangeToReplace.length;
</span><del>- if (!_flags.isIndexing) {
- RetainPtr<NSDictionary> attrs = [self _attributesForElement:element];
- if (!_flags.isTesting && rangeToReplace.length > 0)
- [_attrStr setAttributes:attrs.get() range:rangeToReplace];
- }
</del><ins>+ RetainPtr<NSDictionary> attrs = _attributesForElement(element);
+ if (rangeToReplace.length > 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 < _domRangeStartIndex)
</span><span class="cx"> _domRangeStartIndex += rangeToReplace.length;
</span><del>- if (!_flags.isIndexing) {
- RetainPtr<NSDictionary> attrs = [self _attributesForElement:element];
- if (!_flags.isTesting && rangeToReplace.length > 0)
- [_attrStr setAttributes:attrs.get() range:rangeToReplace];
- }
</del><ins>+ RetainPtr<NSDictionary> attrs = _attributesForElement(element);
+ if (rangeToReplace.length > 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:@"width"];
</span><span class="cx">
</span><span class="cx"> if ((width && [width length]) || !isTable) {
</span><del>- if ([self _getFloat:&val forNode:element property:CSSPropertyWidth])
</del><ins>+ if (_getFloat(&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:&val forNode:element property:CSSPropertyMinWidth])
</del><ins>+ if (_getFloat(&val, element, CSSPropertyMinWidth))
</ins><span class="cx"> [block setValue:val type:NSTextBlockAbsoluteValueType forDimension:NSTextBlockMinimumWidth];
</span><del>- if ([self _getFloat:&val forNode:element property:CSSPropertyMaxWidth])
</del><ins>+ if (_getFloat(&val, element, CSSPropertyMaxWidth))
</ins><span class="cx"> [block setValue:val type:NSTextBlockAbsoluteValueType forDimension:NSTextBlockMaximumWidth];
</span><del>- if ([self _getFloat:&val forNode:element property:CSSPropertyMinHeight])
</del><ins>+ if (_getFloat(&val, element, CSSPropertyMinHeight))
</ins><span class="cx"> [block setValue:val type:NSTextBlockAbsoluteValueType forDimension:NSTextBlockMinimumHeight];
</span><del>- if ([self _getFloat:&val forNode:element property:CSSPropertyMaxHeight])
</del><ins>+ if (_getFloat(&val, element, CSSPropertyMaxHeight))
</ins><span class="cx"> [block setValue:val type:NSTextBlockAbsoluteValueType forDimension:NSTextBlockMaximumHeight];
</span><span class="cx">
</span><del>- if ([self _getFloat:&val forNode:element property:CSSPropertyPaddingLeft])
</del><ins>+ if (_getFloat(&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:&val forNode:element property:CSSPropertyPaddingTop])
</del><ins>+ else
+ [block setWidth:extraPadding type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockPadding edge:NSMinXEdge];
+ if (_getFloat(&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:&val forNode:element property:CSSPropertyPaddingRight])
</del><ins>+ if (_getFloat(&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:&val forNode:element property:CSSPropertyPaddingBottom])
</del><ins>+ if (_getFloat(&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:&val forNode:element property:CSSPropertyBorderLeftWidth])
</del><ins>+ if (_getFloat(&val, element, CSSPropertyBorderLeftWidth))
</ins><span class="cx"> [block setWidth:val type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockBorder edge:NSMinXEdge];
</span><del>- if ([self _getFloat:&val forNode:element property:CSSPropertyBorderTopWidth])
</del><ins>+ if (_getFloat(&val, element, CSSPropertyBorderTopWidth))
</ins><span class="cx"> [block setWidth:val type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockBorder edge:NSMinYEdge];
</span><del>- if ([self _getFloat:&val forNode:element property:CSSPropertyBorderRightWidth])
</del><ins>+ if (_getFloat(&val, element, CSSPropertyBorderRightWidth))
</ins><span class="cx"> [block setWidth:val type:NSTextBlockAbsoluteValueType forLayer:NSTextBlockBorder edge:NSMaxXEdge];
</span><del>- if ([self _getFloat:&val forNode:element property:CSSPropertyBorderBottomWidth])
</del><ins>+ if (_getFloat(&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:&val forNode:element property:CSSPropertyMarginLeft])
</del><ins>+ if (_getFloat(&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:&val forNode:element property:CSSPropertyMarginTop])
</del><ins>+ if (_getFloat(&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:&val forNode:element property:CSSPropertyMarginRight])
</del><ins>+ if (_getFloat(&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:&val forNode:element property:CSSPropertyMarginBottom])
</del><ins>+ if (_getFloat(&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 && backgroundColor) [block setBackgroundColor:backgroundColor];
- if ((color = [self _colorForNode:element property:CSSPropertyBorderLeftColor]))
</del><ins>+ if (!color && 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 < 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 == [@"CocoaVersion" 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 < 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 && 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 ([@"HEAD" isEqualToString:tag] && !embedded)
</span><del>- [self _processHeadElement:element];
</del><ins>+ _processHeadElement(element);
</ins><span class="cx"> else if (!displayVal || !([@"none" isEqualToString:displayVal] || [@"table-column" isEqualToString:displayVal] || [@"table-column-group" isEqualToString:displayVal])) {
</span><del>- if ([self _elementIsBlockLevel:element] && ![@"BR" isEqualToString:tag] && !([@"table-cell" isEqualToString:displayVal] && [_textTables count] == 0)
</del><ins>+ if (_elementIsBlockLevel(element) && ![@"BR" isEqualToString:tag] && !([@"table-cell" isEqualToString:displayVal] && [_textTables count] == 0)
</ins><span class="cx"> && !([_textLists count] > 0 && [@"block" isEqualToString:displayVal] && ![@"LI" isEqualToString:tag] && ![@"UL" isEqualToString:tag] && ![@"OL" 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<NSTextTable> 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 && [cellSpacing length] > 0 && ![cellSpacing hasSuffix:@"%"]) cellSpacingVal = [cellSpacing floatValue];
</del><ins>+ if (cellSpacing && [cellSpacing length] > 0 && ![cellSpacing hasSuffix:@"%"])
+ 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 && [cellPadding length] > 0 && ![cellPadding hasSuffix:@"%"]) cellPaddingVal = [cellPadding floatValue];
</del><ins>+ if (cellPadding && [cellPadding length] > 0 && ![cellPadding hasSuffix:@"%"])
+ 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 ([@"collapse" isEqualToString:borderCollapse]) {
</span><span class="cx"> [table setCollapsesBorders:YES];
</span><span class="cx"> cellSpacingVal = 0;
</span><span class="cx"> }
</span><del>- if ([@"hide" isEqualToString:emptyCells]) [table setHidesEmptyCells:YES];
- if ([@"fixed" isEqualToString:tableLayout]) [table setLayoutAlgorithm:NSTextTableFixedLayoutAlgorithm];
</del><ins>+ if ([@"hide" isEqualToString:emptyCells])
+ [table setHidesEmptyCells:YES];
+ if ([@"fixed" 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<NSTextTableBlock> 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 ([@"middle" isEqualToString:verticalAlign])
</span><span class="cx"> [block setVerticalAlignment:NSTextBlockMiddleAlignment];
</span><span class="cx"> else if ([@"bottom" 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 && [bidi isEqualToString:@"embed"]) {
</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:@"rtl"])
</span><span class="cx"> val |= NSWritingDirectionRightToLeft;
</span><span class="cx"> [_writingDirectionArray addObject:[NSNumber numberWithUnsignedInteger:val]];
</span><span class="cx"> } else if (bidi && [bidi isEqualToString:@"bidi-override"]) {
</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:@"rtl"])
</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 ([@"table-row-group" 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 (![@"table" isEqualToString:[self _stringForNode:tableElement property:CSSPropertyDisplay]])
</del><ins>+ tableElement = _blockLevelElementForNode([element parentNode]);
+ if (![@"table" isEqualToString:_stringForNode(tableElement, CSSPropertyDisplay)])
</ins><span class="cx"> tableElement = element;
</span><span class="cx"> }
</span><span class="cx"> while ([_textTables count] > [_textBlocks count])
</span><del>- [self _addTableCellForElement:nil];
- [self _addTableForElement:tableElement];
</del><ins>+ _addTableCellForElement(nil);
+ _addTableForElement(tableElement);
</ins><span class="cx"> } else if ([@"table-footer-group" isEqualToString:displayVal] && [_textTables count] > 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 ([@"table-row" isEqualToString:displayVal] && [_textTables count] > 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 ([@"table-cell" isEqualToString:displayVal]) {
</span><del>- while ([_textTables count] < [_textBlocks count] + 1) {
- [self _addTableForElement:nil];
- }
- [self _addTableCellForElement:element];
</del><ins>+ while ([_textTables count] < [_textBlocks count] + 1)
+ _addTableForElement(nil);
+ _addTableCellForElement(element);
</ins><span class="cx"> } else if ([@"IMG" isEqualToString:tag]) {
</span><span class="cx"> NSString *urlString = [element getAttribute:@"src"];
</span><span class="cx"> if (urlString && [urlString length] > 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 ([@"OBJECT" 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])->completeURL(stripLeadingAndTrailingHTMLSpaces(urlString));
</del><ins>+ url = core([element ownerDocument])->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 ([@"FRAME" 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 ([@"IFRAME" 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 ([@"BR" 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:@"class"], *blockTag = [blockElement tagName];
</span><span class="cx"> BOOL isExtraBreak = [@"Apple-interchange-newline" isEqualToString:breakClass], blockElementIsParagraph = ([@"P" isEqualToString:blockTag] || [@"LI" isEqualToString:blockTag] || ([blockTag hasPrefix:@"H"] && 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 && 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 ([@"UL" isEqualToString:tag]) {
</span><span class="cx"> RetainPtr<NSTextList> 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 = @"disc";
</span><span class="cx"> list = adoptNS([[PlatformNSTextList alloc] initWithMarkerFormat:[NSString stringWithFormat:@"{%@}", listStyleType] options:0]);
</span><span class="cx"> [_textLists addObject:list.get()];
</span><span class="cx"> } else if ([@"OL" isEqualToString:tag]) {
</span><span class="cx"> RetainPtr<NSTextList> list;
</span><del>- NSString *listStyleType = [self _stringForNode:element property:CSSPropertyListStyleType];
- if (!listStyleType || [listStyleType length] == 0) listStyleType = @"decimal";
</del><ins>+ NSString *listStyleType = _stringForNode(element, CSSPropertyListStyleType);
+ if (!listStyleType || [listStyleType length] == 0)
+ listStyleType = @"decimal";
</ins><span class="cx"> list = adoptNS([[PlatformNSTextList alloc] initWithMarkerFormat:[NSString stringWithFormat:@"{%@}.", 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 ([@"Q" isEqualToString:tag]) {
</span><del>- [self _addQuoteForElement:element opening:YES level:_quoteLevel++];
</del><ins>+ _addQuoteForElement(element, YES, _quoteLevel++);
</ins><span class="cx"> } else if ([@"INPUT" isEqualToString:tag]) {
</span><span class="cx"> if ([element respondsToSelector:@selector(type)] && [element respondsToSelector:@selector(value)] && [@"text" compare:[(DOMHTMLInputElement *)element type] options:NSCaseInsensitiveSearch] == NSOrderedSame) {
</span><span class="cx"> NSString *value = [(DOMHTMLInputElement *)element value];
</span><del>- if (value && [value length] > 0) [self _addValue:value forElement:element];
</del><ins>+ if (value && [value length] > 0)
+ _addValue(value, element);
</ins><span class="cx"> }
</span><span class="cx"> } else if ([@"TEXTAREA" isEqualToString:tag]) {
</span><span class="cx"> if ([element respondsToSelector:@selector(value)]) {
</span><span class="cx"> NSString *value = [(DOMHTMLTextAreaElement *)element value];
</span><del>- if (value && [value length] > 0) [self _addValue:value forElement:element];
</del><ins>+ if (value && [value length] > 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:@"\t%@\t", [list markerForItemNumber:itemNum++]];
</span><span class="cx"> insertLength = [stringToInsert length];
</span><del>- if (!_flags.isIndexing && !_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 && !_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 < _domRangeStartIndex) _domRangeStartIndex += insertLength;
</span><span class="lines">@@ -2006,9 +2078,13 @@
</span><span class="cx"> while ((count = [[newStyle tabStops] count]) > 0) {
</span><span class="cx"> for (i = 0, tabToRemove = nil; !tabToRemove && i < count; i++) {
</span><span class="cx"> tab = [[newStyle tabStops] objectAtIndex:i];
</span><del>- if ([tab location] <= listLocation) tabToRemove = tab;
</del><ins>+ if ([tab location] <= 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 && !_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 > 0 && [@"A" isEqualToString:tag]) {
</span><span class="lines">@@ -2045,21 +2121,20 @@
</span><span class="cx"> url = core([element ownerDocument])->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 && !_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 && [self _elementIsBlockLevel:element]) {
</del><ins>+ if (!_flags.reachedEnd && _elementIsBlockLevel(element)) {
</ins><span class="cx"> [_writingDirectionArray removeAllObjects];
</span><span class="cx"> if ([@"table-cell" isEqualToString:displayVal] && [_textBlocks count] == 0) {
</span><del>- [self _newTabForElement:element];
</del><ins>+ _newTabForElement(element);
</ins><span class="cx"> } else if ([_textLists count] > 0 && [@"block" isEqualToString:displayVal] && ![@"LI" isEqualToString:tag] && ![@"UL" isEqualToString:tag] && ![@"OL" 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] > 0) {
</span><del>- NSString *bidi = [self _stringForNode:element property:CSSPropertyUnicodeBidi];
</del><ins>+ NSString *bidi = _stringForNode(element, CSSPropertyUnicodeBidi);
</ins><span class="cx"> if (bidi && ([bidi isEqualToString:@"embed"] || [bidi isEqualToString:@"bidi-override"])) {
</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] < [_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 (([@"UL" isEqualToString:tag] || [@"OL" isEqualToString:tag]) && [_textLists count] > 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 ([@"Q" isEqualToString:tag]) {
</span><del>- [self _addQuoteForElement:element opening:NO level:--_quoteLevel];
</del><ins>+ _addQuoteForElement(element, NO, --_quoteLevel);
</ins><span class="cx"> } else if ([@"SPAN" isEqualToString:tag]) {
</span><span class="cx"> NSString *className = [element getAttribute:@"class"];
</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 && 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<NSDictionary> 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<NSMutableDictionary> 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<NSDictionary> 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<NSMutableDictionary> 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 && rangeToReplace.length > 0)
- [_attrStr setAttributes:attrs.get() range:rangeToReplace];
</del><ins>+ element = (DOMElement *)[element parentNode];
</ins><span class="cx"> }
</span><ins>+ if (rangeToReplace.length > 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 && i == startOffset)
</span><span class="cx"> _domRangeStartIndex = [_attrStr length];
</span><span class="cx"> if ((!isStart || startOffset <= i) && (!isEnd || endOffset > 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 && i + 1 >= endOffset)
</span><span class="cx"> _flags.reachedEnd = YES;
</span><del>- if (_thumbnailLimit > 0 && [_attrStr length] >= _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 < count; i++) {
</span><span class="cx"> if (isStart && i == startOffset)
</span><span class="cx"> _domRangeStartIndex = [_attrStr length];
</span><span class="cx"> if ((!isStart || startOffset <= i) && (!isEnd || endOffset > 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 && i + 1 >= 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 = @"TBODY", *displayVal = @"table-row-group";
</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 < count; i++) {
</span><span class="cx"> if (isStart && i == startOffset)
</span><span class="cx"> _domRangeStartIndex = [_attrStr length];
</span><span class="cx"> if ((!isStart || startOffset <= i) && (!isEnd || endOffset > 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 && i + 1 >= 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 > 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:@"\n"];
</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)->frame()->loader().documentLoader();
</span><del>- if (_textSizeMultiplier <= 0.0)
- _textSizeMultiplier = 1;
- if (_defaultFontSize <= 0.0)
- _defaultFontSize = 12;
- if (_minimumFontSize < 1.0)
- _minimumFontSize = 1;
</del><ins>+
</ins><span class="cx"> if (_document && _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 > 0 && _domRangeStartIndex <= [_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<ArchiveResource> resource = dataSource->subresource(URL);
+ if (resource) {
+ NSFileWrapper *wrapper = [[[NSFileWrapper alloc] initRegularFileWithContents:resource->data()->createNSData().get()] autorelease];
+ NSString *filename = resource->response().suggestedFilename();
+ if (!filename || ![filename length])
+ filename = suggestedFilenameWithMIMEType(resource->url(), resource->mimeType());
+ [wrapper setPreferredFilename:filename];
+ return wrapper;
+ }
</ins><span class="cx">
</span><del>- _caches = std::make_unique<HTMLConverterCaches>();
</del><ins>+ NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:URL];
</ins><span class="cx">
</span><del>- _flags.isIndexing = (_indexingLimit > 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& attr = element->getAttribute(srcAttr);
+ if (!attr.isEmpty()) {
+ NSURL *URL = element->document().completeURL(attr);
+ if (DocumentLoader* loader = element->document().loader())
+ wrapper = fileWrapperForURL(loader, URL);
+ }
+ if (!wrapper) {
+ RenderImage* renderer = toRenderImage(element->renderer());
+ if (renderer->cachedImage() && !renderer->cachedImage()->errorOccurred()) {
+ wrapper = [[NSFileWrapper alloc] initRegularFileWithContents:(NSData *)(renderer->cachedImage()->imageForRenderer(renderer)->getTIFFRepresentation())];
+ [wrapper setPreferredFilename:@"image.tiff"];
+ [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& range)
</ins><span class="cx"> {
</span><del>- RetainPtr<WebHTMLConverter> converter = adoptNS([[WebHTMLConverter alloc] initWithDOMRange:kit(range)]);
- return [converter attributedString];
</del><ins>+ HTMLConverter converter(kit(&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& 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<NSMutableDictionary> attrs = adoptNS([[NSMutableDictionary alloc] init]);
</span><span class="cx">
</span><del>- for (TextIterator it(range); !it.atEnd(); it.advance()) {
</del><ins>+ for (TextIterator it(&range); !it.atEnd(); it.advance()) {
</ins><span class="cx"> RefPtr<Range> currentTextRange = it.range();
</span><span class="cx"> Node* startContainer = currentTextRange->startContainer();
</span><span class="cx"> Node* endContainer = currentTextRange->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<ArchiveResource> resource = dataSource->subresource(URL);
- if (resource) {
- NSFileWrapper *wrapper = [[[NSFileWrapper alloc] initRegularFileWithContents:resource->data()->createNSData().get()] autorelease];
- NSString *filename = resource->response().suggestedFilename();
- if (!filename || ![filename length])
- filename = suggestedFilenameWithMIMEType(resource->url(), resource->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& attr = element->getAttribute(srcAttr);
- if (!attr.isEmpty()) {
- NSURL *URL = element->document().completeURL(attr);
- if (DocumentLoader* loader = element->document().loader())
- wrapper = fileWrapperForURL(loader, URL);
- }
- if (!wrapper) {
- RenderImage* renderer = toRenderImage(element->renderer());
- if (renderer->cachedImage() && !renderer->cachedImage()->errorOccurred()) {
- wrapper = [[NSFileWrapper alloc] initRegularFileWithContents:(NSData *)(renderer->cachedImage()->imageForRenderer(renderer)->getTIFFRepresentation())];
- [wrapper setPreferredFilename:@"image.tiff"];
- [wrapper autorelease];
- }
- }
-
- return wrapper;
-}
-
-#endif
-
-namespace WebCore {
-
-NSAttributedString *attributedStringFromRange(Range& range)
-{
- return [WebHTMLConverter attributedStringFromRange:&range];
-}
-
-#if !PLATFORM(IOS)
-NSAttributedString *editingAttributedStringFromRange(Range& range)
-{
- return [WebHTMLConverter editingAttributedStringFromRange:&range];
-}
-#endif
-
-}
</del></span></pre>
</div>
</div>
</body>
</html>