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