Changeset 166454 in webkit
- Timestamp:
- Mar 29, 2014 1:03:15 PM (10 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r166451 r166454 1 2014-03-27 Sam Weinig <sam@webkit.org> 2 3 Convert yet more of HTMLConverter to C++ 4 https://bugs.webkit.org/show_bug.cgi?id=130850 5 6 Reviewed by Anders Carlsson. 7 8 * editing/cocoa/HTMLConverter.mm: 9 (HTMLConverterCaches::isAncestorsOfStartToBeConverted): 10 (HTMLConverter::HTMLConverter): 11 (HTMLConverter::~HTMLConverter): 12 (HTMLConverter::convert): 13 (HTMLConverter::computedAttributesForElement): 14 (HTMLConverter::attributesForElement): 15 (HTMLConverter::_newParagraphForElement): 16 (HTMLConverter::_newLineForElement): 17 (HTMLConverter::_newTabForElement): 18 (HTMLConverter::_addAttachmentForElement): 19 (HTMLConverter::_addQuoteForElement): 20 (HTMLConverter::_addValue): 21 (HTMLConverter::_processHeadElement): 22 (HTMLConverter::_enterElement): 23 (HTMLConverter::_addTableCellForElement): 24 (HTMLConverter::_processElement): 25 (HTMLConverter::_addMarkersToList): 26 (HTMLConverter::_exitElement): 27 (HTMLConverter::_processText): 28 (HTMLConverter::_traverseNode): 29 (HTMLConverter::_traverseFooterNode): 30 (WebCore::attributedStringFromRange): 31 (_childrenForNode): Deleted. 32 (HTMLConverter::_computedAttributesForElement): Deleted. 33 (HTMLConverter::_attributesForElement): Deleted. 34 (HTMLConverter::_loadFromDOMRange): Deleted. 35 1 36 2014-03-28 Csaba Osztrogonác <ossy@webkit.org> 2 37 -
trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm
r166347 r166454 28 28 29 29 #import "ArchiveResource.h" 30 #import "CachedImage.h"31 #import "ColorMac.h"32 30 #import "CSSComputedStyleDeclaration.h" 33 31 #import "CSSParser.h" 34 32 #import "CSSPrimitiveValue.h" 33 #import "CachedImage.h" 35 34 #import "CharacterData.h" 35 #import "ColorMac.h" 36 36 #import "Document.h" 37 37 #import "DocumentLoader.h" 38 #import "DOMCSSPrimitiveValueInternal.h"39 #import "DOMCharacterDataInternal.h"40 #import "DOMDocumentInternal.h"41 #import "DOMElementInternal.h"42 #import "DOMHTMLTableCellElement.h"43 #import "DOMNodeInternal.h"44 #import "DOMPrivate.h"45 #import "DOMRGBColorInternal.h"46 #import "DOMRangeInternal.h"47 38 #import "Element.h" 39 #import "ElementTraversal.h" 48 40 #import "Font.h" 49 41 #import "Frame.h" … … 51 43 #import "HTMLElement.h" 52 44 #import "HTMLFrameElementBase.h" 45 #import "HTMLInputElement.h" 46 #import "HTMLMetaElement.h" 53 47 #import "HTMLNames.h" 48 #import "HTMLOListElement.h" 54 49 #import "HTMLParserIdioms.h" 50 #import "HTMLTableCellElement.h" 51 #import "HTMLTextAreaElement.h" 55 52 #import "LoaderNSURLExtras.h" 56 53 #import "RGBColor.h" … … 420 417 421 418 Node* cacheAncestorsOfStartToBeConverted(const Range&); 422 bool isAncestorsOfStartToBeConverted(Node * node) const { return m_ancestorsUnderCommonAncestor.contains(node); }419 bool isAncestorsOfStartToBeConverted(Node& node) const { return m_ancestorsUnderCommonAncestor.contains(&node); } 423 420 424 421 private: … … 442 439 class HTMLConverter { 443 440 public: 444 HTMLConverter( DOMRange*);441 HTMLConverter(Range&); 445 442 ~HTMLConverter(); 446 443 447 NSAttributedString* convert() 448 { 449 _loadFromDOMRange(); 450 if (_errorCode) 451 return nil; 452 return [[_attrStr retain] autorelease]; 453 } 444 NSAttributedString* convert(); 454 445 455 446 private: 447 Ref<Range> m_range; 448 DocumentLoader* m_dataSource; 449 456 450 HashMap<RefPtr<Element>, RetainPtr<NSDictionary>> m_attributesForElements; 451 HashMap<RetainPtr<NSTextTable>, RefPtr<Element>> m_textTableFooters; 457 452 HashMap<RefPtr<Element>, RetainPtr<NSMutableDictionary>> m_aggregatedAttributesForElements; 458 453 … … 460 455 NSMutableDictionary *_documentAttrs; 461 456 NSURL *_baseURL; 462 DOMDocument *_document;463 DOMRange *_domRange;464 WebCore::DocumentLoader *_dataSource;465 457 NSMutableArray *_textLists; 466 458 NSMutableArray *_textBlocks; 467 459 NSMutableArray *_textTables; 468 NSMutableDictionary *_textTableFooters;469 460 NSMutableArray *_textTableSpacings; 470 461 NSMutableArray *_textTablePaddings; … … 477 468 CGFloat _defaultTabInterval; 478 469 NSUInteger _domRangeStartIndex; 479 NSInteger _errorCode;480 470 NSInteger _quoteLevel; 481 471 … … 490 480 } _flags; 491 481 492 void _loadFromDOMRange();493 494 482 PlatformColor *_colorForElement(Element&, CSSPropertyID); 495 483 496 void _traverseNode(Node* node, unsigned depth, bool embedded); 497 void _traverseFooterNode(DOMNode *node, NSInteger depth); 498 499 NSDictionary *_computedAttributesForElement(Element&); 500 NSDictionary *_attributesForElement(DOMElement *); 501 NSDictionary* attributesForElement(Element& element); 502 NSDictionary* aggregatedAttributesForAncestors(CharacterData&); 484 void _traverseNode(Node&, unsigned depth, bool embedded); 485 void _traverseFooterNode(Element&, unsigned depth); 486 487 NSDictionary *computedAttributesForElement(Element&); 488 NSDictionary *attributesForElement(Element&); 489 NSDictionary *aggregatedAttributesForAncestors(CharacterData&); 503 490 504 491 Element* _blockLevelElementForNode(Node*); 505 492 506 void _newParagraphForElement( DOMElement *element, NSString *tag, BOOL flag, BOOL suppressTrailingSpace);507 void _newLineForElement( DOMElement *element);508 void _newTabForElement( DOMElement *element);509 BOOL _addAttachmentForElement( DOMElement *element, NSURL *url, BOOL needsParagraph, BOOL usePlaceholder);510 void _addQuoteForElement( DOMElement *element, BOOL opening, NSInteger level);511 void _addValue(NSString *value, DOMElement *element);493 void _newParagraphForElement(Element&, NSString *tag, BOOL flag, BOOL suppressTrailingSpace); 494 void _newLineForElement(Element&); 495 void _newTabForElement(Element&); 496 BOOL _addAttachmentForElement(Element&, NSURL *url, BOOL needsParagraph, BOOL usePlaceholder); 497 void _addQuoteForElement(Element&, BOOL opening, NSInteger level); 498 void _addValue(NSString *value, Element&); 512 499 void _fillInBlock(NSTextBlock *block, Element&, PlatformColor *backgroundColor, CGFloat extraMargin, CGFloat extraPadding, BOOL isTable); 500 501 BOOL _enterElement(Element&, BOOL embedded); 502 BOOL _processElement(Element&, NSInteger depth); 503 void _exitElement(Element&, NSInteger depth, NSUInteger startIndex); 504 505 void _processHeadElement(Element&); 513 506 void _processMetaElementWithName(NSString *name, NSString *content); 514 void _processHeadElement(DOMElement *element); 515 BOOL _enterElement(DOMElement *element, BOOL embedded); 516 void _addTableForElement(Element *tableElement); 517 void _addTableCellForElement(DOMElement *tableCellElement); 518 BOOL _processElement(DOMElement *element, NSInteger depth); 507 508 void _addTableForElement(Element* tableElement); 509 void _addTableCellForElement(Element* tableCellElement); 519 510 void _addMarkersToList(NSTextList *list, NSRange range); 520 void _exitElement(DOMElement *element, NSInteger depth, NSUInteger startIndex);521 511 void _processText(CharacterData&); 522 512 void _adjustTrailingNewline(); 523 513 }; 524 514 525 HTMLConverter::HTMLConverter(DOMRange* domRange) 526 { 527 _domRange = [domRange retain]; 515 HTMLConverter::HTMLConverter(Range& range) 516 : m_range(range) 517 , m_dataSource(nullptr) 518 { 528 519 _attrStr = [[NSMutableAttributedString alloc] init]; 529 520 _documentAttrs = [[NSMutableDictionary alloc] init]; 530 521 _baseURL = nil; 531 _document = nil;532 _dataSource = nullptr;533 522 _textLists = [[NSMutableArray alloc] init]; 534 523 _textBlocks = [[NSMutableArray alloc] init]; 535 524 _textTables = [[NSMutableArray alloc] init]; 536 _textTableFooters = [[NSMutableDictionary alloc] init];537 525 _textTableSpacings = [[NSMutableArray alloc] init]; 538 526 _textTablePaddings = [[NSMutableArray alloc] init]; … … 545 533 _defaultTabInterval = 36; 546 534 _domRangeStartIndex = 0; 547 _errorCode = -1;548 535 _quoteLevel = 0; 549 536 … … 559 546 [_attrStr release]; 560 547 [_documentAttrs release]; 561 [_domRange release];562 548 [_textLists release]; 563 549 [_textBlocks release]; 564 550 [_textTables release]; 565 [_textTableFooters release];566 551 [_textTableSpacings release]; 567 552 [_textTablePaddings release]; … … 571 556 [_fontCache release]; 572 557 [_writingDirectionArray release]; 558 } 559 560 NSAttributedString *HTMLConverter::convert() 561 { 562 Node* commonAncestorContainer = _caches->cacheAncestorsOfStartToBeConverted(m_range.get()); 563 ASSERT(commonAncestorContainer); 564 565 m_dataSource = commonAncestorContainer->document().frame()->loader().documentLoader(); 566 if (!m_dataSource) 567 return nil; 568 569 _domRangeStartIndex = 0; 570 _traverseNode(*commonAncestorContainer, 0, false /* embedded */); 571 if (_domRangeStartIndex > 0 && _domRangeStartIndex <= [_attrStr length]) 572 [_attrStr deleteCharactersInRange:NSMakeRange(0, _domRangeStartIndex)]; 573 574 return [[_attrStr retain] autorelease]; 573 575 } 574 576 … … 689 691 } 690 692 return defaultParagraphStyle; 691 }692 693 694 static NSArray *_childrenForNode(DOMNode *node)695 {696 NSMutableArray *array = [NSMutableArray array];697 DOMNode *child = [node firstChild];698 while (child) {699 [array addObject:child];700 child = [child nextSibling];701 }702 return array;703 693 } 704 694 … … 1135 1125 #define UIFloatIsZero(number) (fabs(number - 0) < FLT_EPSILON) 1136 1126 1137 NSDictionary *HTMLConverter:: _computedAttributesForElement(Element& element)1127 NSDictionary *HTMLConverter::computedAttributesForElement(Element& element) 1138 1128 { 1139 1129 NSMutableDictionary *attrs = [NSMutableDictionary dictionary]; … … 1352 1342 } 1353 1343 1354 NSDictionary *HTMLConverter::_attributesForElement(DOMElement *element)1355 {1356 if (!element)1357 return [NSDictionary dictionary];1358 return attributesForElement(*core(element));1359 }1360 1344 1361 1345 NSDictionary* HTMLConverter::attributesForElement(Element& element) … … 1363 1347 auto& attributes = m_attributesForElements.add(&element, nullptr).iterator->value; 1364 1348 if (!attributes) 1365 attributes = _computedAttributesForElement(element);1349 attributes = computedAttributesForElement(element); 1366 1350 return attributes.get(); 1367 1351 } … … 1395 1379 } 1396 1380 1397 void HTMLConverter::_newParagraphForElement( DOMElement *element, NSString *tag, BOOL flag, BOOL suppressTrailingSpace)1381 void HTMLConverter::_newParagraphForElement(Element& element, NSString *tag, BOOL flag, BOOL suppressTrailingSpace) 1398 1382 { 1399 1383 NSUInteger textLength = [_attrStr length]; … … 1408 1392 _domRangeStartIndex += [string length] - rangeToReplace.length; 1409 1393 rangeToReplace.length = [string length]; 1410 NSDictionary *attrs = _attributesForElement(element);1394 NSDictionary *attrs = attributesForElement(element); 1411 1395 if (rangeToReplace.length > 0) 1412 1396 [_attrStr setAttributes:attrs range:rangeToReplace]; … … 1415 1399 } 1416 1400 1417 void HTMLConverter::_newLineForElement( DOMElement *element)1401 void HTMLConverter::_newLineForElement(Element& element) 1418 1402 { 1419 1403 unichar c = NSLineSeparatorCharacter; … … 1425 1409 if (rangeToReplace.location < _domRangeStartIndex) 1426 1410 _domRangeStartIndex += rangeToReplace.length; 1427 NSDictionary *attrs = _attributesForElement(element);1411 NSDictionary *attrs = attributesForElement(element); 1428 1412 if (rangeToReplace.length > 0) 1429 1413 [_attrStr setAttributes:attrs range:rangeToReplace]; … … 1431 1415 } 1432 1416 1433 void HTMLConverter::_newTabForElement( DOMElement *element)1417 void HTMLConverter::_newTabForElement(Element& element) 1434 1418 { 1435 1419 NSString *string = @"\t"; … … 1441 1425 if (rangeToReplace.location < _domRangeStartIndex) 1442 1426 _domRangeStartIndex += rangeToReplace.length; 1443 NSDictionary *attrs = _attributesForElement(element);1427 NSDictionary *attrs = attributesForElement(element); 1444 1428 if (rangeToReplace.length > 0) 1445 1429 [_attrStr setAttributes:attrs range:rangeToReplace]; … … 1461 1445 } 1462 1446 1463 BOOL HTMLConverter::_addAttachmentForElement(DOMElement *element, NSURL *url, BOOL needsParagraph, BOOL usePlaceholder) 1464 { 1465 BOOL retval = NO, notFound = NO; 1447 BOOL HTMLConverter::_addAttachmentForElement(Element& element, NSURL *url, BOOL needsParagraph, BOOL usePlaceholder) 1448 { 1449 BOOL retval = NO; 1450 BOOL notFound = NO; 1466 1451 NSFileWrapper *fileWrapper = nil; 1467 Frame* frame = core([element ownerDocument])->frame();1452 Frame* frame = element.document().frame(); 1468 1453 DocumentLoader *dataSource = frame->loader().frameHasLoaded() ? frame->loader().documentLoader() : 0; 1469 1454 BOOL ignoreOrientation = YES; … … 1496 1481 } 1497 1482 if (!fileWrapper && !notFound) { 1498 fileWrapper = fileWrapperForURL( _dataSource, url);1483 fileWrapper = fileWrapperForURL(m_dataSource, url); 1499 1484 if (usePlaceholder && fileWrapper && [[[[fileWrapper preferredFilename] pathExtension] lowercaseString] hasPrefix:@"htm"]) 1500 1485 notFound = YES; … … 1551 1536 if (rangeToReplace.location < _domRangeStartIndex) 1552 1537 _domRangeStartIndex += rangeToReplace.length; 1553 attrs = _attributesForElement(element);1538 attrs = attributesForElement(element); 1554 1539 if (rangeToReplace.length > 0) { 1555 1540 [_attrStr setAttributes:attrs range:rangeToReplace]; … … 1563 1548 } 1564 1549 1565 void HTMLConverter::_addQuoteForElement( DOMElement *element, BOOL opening, NSInteger level)1550 void HTMLConverter::_addQuoteForElement(Element& element, BOOL opening, NSInteger level) 1566 1551 { 1567 1552 unichar c = ((level % 2) == 0) ? (opening ? 0x201c : 0x201d) : (opening ? 0x2018 : 0x2019); … … 1573 1558 if (rangeToReplace.location < _domRangeStartIndex) 1574 1559 _domRangeStartIndex += rangeToReplace.length; 1575 RetainPtr<NSDictionary> attrs = _attributesForElement(element);1560 RetainPtr<NSDictionary> attrs = attributesForElement(element); 1576 1561 if (rangeToReplace.length > 0) 1577 1562 [_attrStr setAttributes:attrs.get() range:rangeToReplace]; … … 1579 1564 } 1580 1565 1581 void HTMLConverter::_addValue(NSString *value, DOMElement *element)1566 void HTMLConverter::_addValue(NSString *value, Element& element) 1582 1567 { 1583 1568 NSUInteger textLength = [_attrStr length]; … … 1589 1574 if (rangeToReplace.location < _domRangeStartIndex) 1590 1575 _domRangeStartIndex += rangeToReplace.length; 1591 RetainPtr<NSDictionary> attrs = _attributesForElement(element);1576 RetainPtr<NSDictionary> attrs = attributesForElement(element); 1592 1577 if (rangeToReplace.length > 0) 1593 1578 [_attrStr setAttributes:attrs.get() range:rangeToReplace]; … … 1807 1792 } 1808 1793 1809 void HTMLConverter::_processHeadElement(DOMElement *element) 1810 { 1811 // ??? should gather data from other sources e.g. Word, but for that we would need to be able to get comments from DOM 1812 NSArray *childNodes = _childrenForNode(element); 1813 NSUInteger count = [childNodes count]; 1814 for (NSUInteger i = 0; i < count; i++) { 1815 DOMNode *node = [childNodes objectAtIndex:i]; 1816 unsigned short nodeType = [node nodeType]; 1817 if (DOM_ELEMENT_NODE == nodeType) { 1818 DOMElement *element = (DOMElement *)node; 1819 NSString *tag = [element tagName]; 1820 if ([@"META" isEqualToString:tag] && [element respondsToSelector:@selector(name)] && [element respondsToSelector:@selector(content)]) { 1821 NSString *name = [(DOMHTMLMetaElement *)element name]; 1822 NSString *content = [(DOMHTMLMetaElement *)element content]; 1823 if (name && content) 1824 _processMetaElementWithName(name, content); 1825 } 1826 } 1827 } 1828 } 1829 1830 BOOL HTMLConverter::_enterElement(DOMElement *element, BOOL embedded) 1831 { 1832 ASSERT(element); 1833 Element& coreElement = *core(element); 1834 String displayValue = _caches->propertyValueForNode(coreElement, CSSPropertyDisplay); 1835 1836 if (coreElement.hasTagName(headTag) && !embedded) 1794 void HTMLConverter::_processHeadElement(Element& element) 1795 { 1796 // FIXME: Should gather data from other sources e.g. Word, but for that we would need to be able to get comments from DOM 1797 1798 for (HTMLMetaElement* child = Traversal<HTMLMetaElement>::firstChild(&element); child; child = Traversal<HTMLMetaElement>::nextSibling(child)) { 1799 NSString *name = child->name(); 1800 NSString *content = child->content(); 1801 if (name && content) 1802 _processMetaElementWithName(name, content); 1803 } 1804 } 1805 1806 BOOL HTMLConverter::_enterElement(Element& element, BOOL embedded) 1807 { 1808 String displayValue = _caches->propertyValueForNode(element, CSSPropertyDisplay); 1809 1810 if (element.hasTagName(headTag) && !embedded) 1837 1811 _processHeadElement(element); 1838 1812 else if (!displayValue.length() || !(displayValue == "none" || displayValue == "table-column" || displayValue == "table-column-group")) { 1839 if (_caches->isBlockElement( coreElement) && !coreElement.hasTagName(brTag) && !(displayValue == "table-cell" && [_textTables count] == 0)1840 && !([_textLists count] > 0 && displayValue == "block" && ! coreElement.hasTagName(liTag) && !coreElement.hasTagName(ulTag) && !coreElement.hasTagName(olTag)))1841 _newParagraphForElement(element, [element tagName], NO, YES);1813 if (_caches->isBlockElement(element) && !element.hasTagName(brTag) && !(displayValue == "table-cell" && [_textTables count] == 0) 1814 && !([_textLists count] > 0 && displayValue == "block" && !element.hasTagName(liTag) && !element.hasTagName(ulTag) && !element.hasTagName(olTag))) 1815 _newParagraphForElement(element, element.tagName(), NO, YES); 1842 1816 return YES; 1843 1817 } … … 1885 1859 } 1886 1860 1887 void HTMLConverter::_addTableCellForElement( DOMElement *tableCellElement)1861 void HTMLConverter::_addTableCellForElement(Element* element) 1888 1862 { 1889 1863 NSTextTable *table = [_textTables lastObject]; … … 1903 1877 columnNumber = [previousBlock startingColumn] + [previousBlock columnSpan]; 1904 1878 } 1905 if (tableCellElement) { 1906 if ([tableCellElement respondsToSelector:@selector(rowSpan)]) { 1907 rowSpan = [(DOMHTMLTableCellElement *)tableCellElement rowSpan]; 1879 1880 RetainPtr<NSTextTableBlock> block; 1881 1882 if (element) { 1883 if (isHTMLTableCellElement(*element)) { 1884 HTMLTableCellElement& tableCellElement = toHTMLTableCellElement(*element); 1885 1886 rowSpan = tableCellElement.rowSpan(); 1908 1887 if (rowSpan < 1) 1909 1888 rowSpan = 1; 1910 } 1911 if ([tableCellElement respondsToSelector:@selector(colSpan)]) { 1912 colSpan = [(DOMHTMLTableCellElement *)tableCellElement colSpan]; 1889 colSpan = tableCellElement.colSpan(); 1913 1890 if (colSpan < 1) 1914 1891 colSpan = 1; 1915 1892 } 1916 }1917 RetainPtr<NSTextTableBlock> block = adoptNS([[PlatformNSTextTableBlock alloc] initWithTable:table startingRow:rowNumber rowSpan:rowSpan startingColumn:columnNumber columnSpan:colSpan]);1918 if (tableCellElement) {1919 Element& coreTableCellElement = *core(tableCellElement);1920 1893 1921 String verticalAlign = _caches->propertyValueForNode(coreTableCellElement, CSSPropertyVerticalAlign);1894 block = adoptNS([[PlatformNSTextTableBlock alloc] initWithTable:table startingRow:rowNumber rowSpan:rowSpan startingColumn:columnNumber columnSpan:colSpan]); 1922 1895 1923 _fillInBlock(block.get(), coreTableCellElement, color, cellSpacingVal / 2, 0, NO); 1896 String verticalAlign = _caches->propertyValueForNode(*element, CSSPropertyVerticalAlign); 1897 1898 _fillInBlock(block.get(), *element, color, cellSpacingVal / 2, 0, NO); 1924 1899 if (verticalAlign == "middle") 1925 1900 [block setVerticalAlignment:NSTextBlockMiddleAlignment]; … … 1930 1905 else if (verticalAlign == "top") 1931 1906 [block setVerticalAlignment:NSTextBlockTopAlignment]; 1932 } 1907 } else { 1908 block = adoptNS([[PlatformNSTextTableBlock alloc] initWithTable:table startingRow:rowNumber rowSpan:rowSpan startingColumn:columnNumber columnSpan:colSpan]); 1909 } 1910 1933 1911 [_textBlocks addObject:block.get()]; 1934 1912 [rowArray addObject:block.get()]; … … 1936 1914 } 1937 1915 1938 BOOL HTMLConverter::_processElement(DOMElement *element, NSInteger depth) 1939 { 1940 if (!element) 1941 return NO; 1916 BOOL HTMLConverter::_processElement(Element& element, NSInteger depth) 1917 { 1942 1918 BOOL retval = YES; 1943 Element& coreElement = *core(element); 1944 BOOL isBlockLevel = _caches->isBlockElement(coreElement); 1945 String displayValue = _caches->propertyValueForNode(coreElement, CSSPropertyDisplay); 1919 BOOL isBlockLevel = _caches->isBlockElement(element); 1920 String displayValue = _caches->propertyValueForNode(element, CSSPropertyDisplay); 1946 1921 if (isBlockLevel) 1947 1922 [_writingDirectionArray removeAllObjects]; 1948 1923 else { 1949 String bidi = _caches->propertyValueForNode( coreElement, CSSPropertyUnicodeBidi);1924 String bidi = _caches->propertyValueForNode(element, CSSPropertyUnicodeBidi); 1950 1925 if (bidi == "embed") { 1951 1926 NSUInteger val = NSTextWritingDirectionEmbedding; 1952 if (_caches->propertyValueForNode( coreElement, CSSPropertyDirection) == "rtl")1927 if (_caches->propertyValueForNode(element, CSSPropertyDirection) == "rtl") 1953 1928 val |= NSWritingDirectionRightToLeft; 1954 1929 [_writingDirectionArray addObject:[NSNumber numberWithUnsignedInteger:val]]; 1955 1930 } else if (bidi == "bidi-override") { 1956 1931 NSUInteger val = NSTextWritingDirectionOverride; 1957 if (_caches->propertyValueForNode( coreElement, CSSPropertyDirection) == "rtl")1932 if (_caches->propertyValueForNode(element, CSSPropertyDirection) == "rtl") 1958 1933 val |= NSWritingDirectionRightToLeft; 1959 1934 [_writingDirectionArray addObject:[NSNumber numberWithUnsignedInteger:val]]; … … 1961 1936 } 1962 1937 if (displayValue == "table" || ([_textTables count] == 0 && displayValue == "table-row-group")) { 1963 Element* tableElement = & coreElement;1938 Element* tableElement = &element; 1964 1939 if (displayValue == "table-row-group") { 1965 1940 // If we are starting in medias res, the first thing we see may be the tbody, so go up to the table 1966 tableElement = _blockLevelElementForNode( coreElement.parentNode());1941 tableElement = _blockLevelElementForNode(element.parentNode()); 1967 1942 if (!tableElement || _caches->propertyValueForNode(*tableElement, CSSPropertyDisplay) != "table") 1968 tableElement = & coreElement;1943 tableElement = &element; 1969 1944 } 1970 1945 while ([_textTables count] > [_textBlocks count]) … … 1972 1947 _addTableForElement(tableElement); 1973 1948 } else if (displayValue == "table-footer-group" && [_textTables count] > 0) { 1974 [_textTableFooters setObject:element forKey:[NSValue valueWithNonretainedObject:[_textTables lastObject]]];1949 m_textTableFooters.add([_textTables lastObject], &element); 1975 1950 retval = NO; 1976 1951 } else if (displayValue == "table-row" && [_textTables count] > 0) { 1977 PlatformColor *color = _colorForElement(coreElement, CSSPropertyBackgroundColor); 1978 if (!color) color = [PlatformColorClass clearColor]; 1952 PlatformColor *color = _colorForElement(element, CSSPropertyBackgroundColor); 1953 if (!color) 1954 color = [PlatformColorClass clearColor]; 1979 1955 [_textTableRowBackgroundColors addObject:color]; 1980 1956 } else if (displayValue == "table-cell") { 1981 1957 while ([_textTables count] < [_textBlocks count] + 1) 1982 1958 _addTableForElement(nil); 1983 _addTableCellForElement( element);1984 } else if ( coreElement.hasTagName(imgTag)) {1985 NSString *urlString = [element getAttribute:@"src"];1959 _addTableCellForElement(&element); 1960 } else if (element.hasTagName(imgTag)) { 1961 NSString *urlString = element.getAttribute(srcAttr); 1986 1962 if (urlString && [urlString length] > 0) { 1987 NSURL *url = core([element ownerDocument])->completeURL(stripLeadingAndTrailingHTMLSpaces(urlString)); 1988 if (!url) url = [NSURL _web_URLWithString:[urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] relativeToURL:_baseURL]; 1963 NSURL *url = element.document().completeURL(stripLeadingAndTrailingHTMLSpaces(urlString)); 1964 if (!url) 1965 url = [NSURL _web_URLWithString:[urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] relativeToURL:_baseURL]; 1989 1966 #if PLATFORM(IOS) 1990 1967 BOOL usePlaceholderImage = NO; … … 1996 1973 } 1997 1974 retval = NO; 1998 } else if ( coreElement.hasTagName(objectTag)) {1999 NSString *baseString = [element getAttribute:@"codebase"];2000 NSString *urlString = [element getAttribute:@"data"];2001 NSString *declareString = [element getAttribute:@"declare"];1975 } else if (element.hasTagName(objectTag)) { 1976 NSString *baseString = element.getAttribute(codebaseAttr); 1977 NSString *urlString = element.getAttribute(dataAttr); 1978 NSString *declareString = element.getAttribute(declareAttr); 2002 1979 if (urlString && [urlString length] > 0 && ![@"true" isEqualToString:declareString]) { 2003 1980 NSURL *baseURL = nil; 2004 1981 NSURL *url = nil; 2005 1982 if (baseString && [baseString length] > 0) { 2006 baseURL = core([element ownerDocument])->completeURL(stripLeadingAndTrailingHTMLSpaces(baseString));1983 baseURL = element.document().completeURL(stripLeadingAndTrailingHTMLSpaces(baseString)); 2007 1984 if (!baseURL) 2008 1985 baseURL = [NSURL _web_URLWithString:[baseString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] relativeToURL:_baseURL]; … … 2011 1988 url = [NSURL _web_URLWithString:[urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] relativeToURL:baseURL]; 2012 1989 if (!url) 2013 url = core([element ownerDocument])->completeURL(stripLeadingAndTrailingHTMLSpaces(urlString));1990 url = element.document().completeURL(stripLeadingAndTrailingHTMLSpaces(urlString)); 2014 1991 if (!url) 2015 1992 url = [NSURL _web_URLWithString:[urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] relativeToURL:_baseURL]; … … 2017 1994 retval = !_addAttachmentForElement(element, url, isBlockLevel, NO); 2018 1995 } 2019 } else if ( coreElement.hasTagName(frameTag) || coreElement.hasTagName(iframeTag)) {2020 if (Document* contentDocument = toHTMLFrameElementBase( coreElement).contentDocument()) {2021 _traverseNode( contentDocument, depth + 1, true /* embedded */);1996 } else if (element.hasTagName(frameTag) || element.hasTagName(iframeTag)) { 1997 if (Document* contentDocument = toHTMLFrameElementBase(element).contentDocument()) { 1998 _traverseNode(*contentDocument, depth + 1, true /* embedded */); 2022 1999 retval = NO; 2023 2000 } 2024 } else if ( coreElement.hasTagName(brTag)) {2025 Element* blockElement = _blockLevelElementForNode( coreElement.parentNode());2026 NSString *breakClass = [element getAttribute:@"class"];2001 } else if (element.hasTagName(brTag)) { 2002 Element* blockElement = _blockLevelElementForNode(element.parentNode()); 2003 NSString *breakClass = element.getAttribute(classAttr); 2027 2004 NSString *blockTag = blockElement ? (NSString *)blockElement->tagName() : nil; 2028 2005 BOOL isExtraBreak = [@"Apple-interchange-newline" isEqualToString:breakClass]; … … 2034 2011 _newLineForElement(element); 2035 2012 else 2036 _newParagraphForElement(element, [element tagName], YES, NO);2037 } 2038 } else if ( coreElement.hasTagName(ulTag)) {2013 _newParagraphForElement(element, element.tagName(), YES, NO); 2014 } 2015 } else if (element.hasTagName(ulTag)) { 2039 2016 RetainPtr<NSTextList> list; 2040 String listStyleType = _caches->propertyValueForNode( coreElement, CSSPropertyListStyleType);2017 String listStyleType = _caches->propertyValueForNode(element, CSSPropertyListStyleType); 2041 2018 if (!listStyleType.length()) 2042 2019 listStyleType = @"disc"; 2043 2020 list = adoptNS([[PlatformNSTextList alloc] initWithMarkerFormat:String("{" + listStyleType + "}") options:0]); 2044 2021 [_textLists addObject:list.get()]; 2045 } else if ( coreElement.hasTagName(olTag)) {2022 } else if (element.hasTagName(olTag)) { 2046 2023 RetainPtr<NSTextList> list; 2047 String listStyleType = _caches->propertyValueForNode( coreElement, CSSPropertyListStyleType);2024 String listStyleType = _caches->propertyValueForNode(element, CSSPropertyListStyleType); 2048 2025 if (!listStyleType.length()) 2049 2026 listStyleType = "decimal"; 2050 2027 list = adoptNS([[PlatformNSTextList alloc] initWithMarkerFormat:String("{" + listStyleType + "}") options:0]); 2051 if ( [element respondsToSelector:@selector(start)]) {2052 NSInteger startingItemNumber = [(DOMHTMLOListElement *)element start];2028 if (isHTMLOListElement(element)) { 2029 NSInteger startingItemNumber = toHTMLOListElement(element).start();; 2053 2030 [list setStartingItemNumber:startingItemNumber]; 2054 2031 } 2055 2032 [_textLists addObject:list.get()]; 2056 } else if ( coreElement.hasTagName(qTag)) {2033 } else if (element.hasTagName(qTag)) { 2057 2034 _addQuoteForElement(element, YES, _quoteLevel++); 2058 } else if (coreElement.hasTagName(inputTag)) { 2059 if ([element respondsToSelector:@selector(type)] && [element respondsToSelector:@selector(value)] && [@"text" compare:[(DOMHTMLInputElement *)element type] options:NSCaseInsensitiveSearch] == NSOrderedSame) { 2060 NSString *value = [(DOMHTMLInputElement *)element value]; 2061 if (value && [value length] > 0) 2062 _addValue(value, element); 2063 } 2064 } else if (coreElement.hasTagName(textareaTag)) { 2065 if ([element respondsToSelector:@selector(value)]) { 2066 NSString *value = [(DOMHTMLTextAreaElement *)element value]; 2035 } else if (element.hasTagName(inputTag)) { 2036 if (isHTMLInputElement(element)) { 2037 HTMLInputElement& inputElement = toHTMLInputElement(element); 2038 if (inputElement.type() == "text") { 2039 NSString *value = inputElement.value(); 2040 if (value && [value length] > 0) 2041 _addValue(value, element); 2042 } 2043 } 2044 } else if (element.hasTagName(textareaTag)) { 2045 if (isHTMLTextAreaElement(element)) { 2046 HTMLTextAreaElement& textAreaElement = toHTMLTextAreaElement(element); 2047 NSString *value = textAreaElement.value(); 2067 2048 if (value && [value length] > 0) 2068 2049 _addValue(value, element); … … 2119 2100 range.length += insertLength; 2120 2101 paragraphRange.length += insertLength; 2121 if (paragraphRange.location < _domRangeStartIndex) _domRangeStartIndex += insertLength; 2102 if (paragraphRange.location < _domRangeStartIndex) 2103 _domRangeStartIndex += insertLength; 2122 2104 2123 2105 newStyle = [paragraphStyle mutableCopy]; … … 2160 2142 } 2161 2143 2162 void HTMLConverter::_exitElement(DOMElement *element, NSInteger depth, NSUInteger startIndex) 2163 { 2164 ASSERT(element); 2165 Element& coreElement = *core(element); 2166 String displayValue = _caches->propertyValueForNode(coreElement, CSSPropertyDisplay); 2144 void HTMLConverter::_exitElement(Element& element, NSInteger depth, NSUInteger startIndex) 2145 { 2146 String displayValue = _caches->propertyValueForNode(element, CSSPropertyDisplay); 2167 2147 NSRange range = NSMakeRange(startIndex, [_attrStr length] - startIndex); 2168 if (range.length > 0 && coreElement.hasTagName(aTag)) {2169 NSString *urlString = [element getAttribute:@"href"];2148 if (range.length > 0 && element.hasTagName(aTag)) { 2149 NSString *urlString = element.getAttribute(hrefAttr); 2170 2150 NSString *strippedString = [urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 2171 2151 if (urlString && [urlString length] > 0 && strippedString && [strippedString length] > 0 && ![strippedString hasPrefix:@"#"]) { 2172 NSURL *url = core([element ownerDocument])->completeURL(stripLeadingAndTrailingHTMLSpaces(urlString));2152 NSURL *url = element.document().completeURL(stripLeadingAndTrailingHTMLSpaces(urlString)); 2173 2153 if (!url) 2174 url = core([element ownerDocument])->completeURL(stripLeadingAndTrailingHTMLSpaces(strippedString));2154 url = element.document().completeURL(stripLeadingAndTrailingHTMLSpaces(strippedString)); 2175 2155 if (!url) 2176 2156 url = [NSURL _web_URLWithString:strippedString relativeToURL:_baseURL]; … … 2178 2158 } 2179 2159 } 2180 if (!_flags.reachedEnd && _caches->isBlockElement( coreElement)) {2160 if (!_flags.reachedEnd && _caches->isBlockElement(element)) { 2181 2161 [_writingDirectionArray removeAllObjects]; 2182 2162 if (displayValue == "table-cell" && [_textBlocks count] == 0) { 2183 2163 _newTabForElement(element); 2184 } else if ([_textLists count] > 0 && displayValue == "block" && ! coreElement.hasTagName(liTag) && !coreElement.hasTagName(ulTag) && !coreElement.hasTagName(olTag)) {2164 } else if ([_textLists count] > 0 && displayValue == "block" && !element.hasTagName(liTag) && !element.hasTagName(ulTag) && !element.hasTagName(olTag)) { 2185 2165 _newLineForElement(element); 2186 2166 } else { 2187 _newParagraphForElement(element, [element tagName], (range.length == 0), YES);2167 _newParagraphForElement(element, element.tagName(), (range.length == 0), YES); 2188 2168 } 2189 2169 } else if ([_writingDirectionArray count] > 0) { 2190 String bidi = _caches->propertyValueForNode( coreElement, CSSPropertyUnicodeBidi);2170 String bidi = _caches->propertyValueForNode(element, CSSPropertyUnicodeBidi); 2191 2171 if (bidi == "embed" || bidi == "bidi-override") 2192 2172 [_writingDirectionArray removeLastObject]; … … 2194 2174 range = NSMakeRange(startIndex, [_attrStr length] - startIndex); 2195 2175 if (displayValue == "table" && [_textTables count] > 0) { 2196 NS Value *key = [NSValue valueWithNonretainedObject:[_textTables lastObject]];2197 DOMNode *footer = [_textTableFooters objectForKey:key];2176 NSTextTable *key = [_textTables lastObject]; 2177 Element* footer = m_textTableFooters.get(key); 2198 2178 while ([_textTables count] < [_textBlocks count] + 1) 2199 2179 [_textBlocks removeLastObject]; 2200 2180 if (footer) { 2201 _traverseFooterNode( footer, depth + 1);2202 [_textTableFooters removeObjectForKey:key];2181 _traverseFooterNode(*footer, depth + 1); 2182 m_textTableFooters.remove(key); 2203 2183 } 2204 2184 [_textTables removeLastObject]; … … 2249 2229 } 2250 2230 [_textBlocks removeLastObject]; 2251 } else if (( coreElement.hasTagName(ulTag) || coreElement.hasTagName(olTag)) && [_textLists count] > 0) {2231 } else if ((element.hasTagName(ulTag) || element.hasTagName(olTag)) && [_textLists count] > 0) { 2252 2232 NSTextList *list = [_textLists lastObject]; 2253 2233 _addMarkersToList(list, range); 2254 2234 [_textLists removeLastObject]; 2255 } else if ( coreElement.hasTagName(qTag)) {2235 } else if (element.hasTagName(qTag)) { 2256 2236 _addQuoteForElement(element, NO, --_quoteLevel); 2257 } else if ( coreElement.hasTagName(spanTag)) {2258 NSString *className = [element getAttribute:@"class"];2237 } else if (element.hasTagName(spanTag)) { 2238 NSString *className = element.getAttribute(classAttr); 2259 2239 NSMutableString *mutableString; 2260 2240 NSUInteger i, count = 0; … … 2307 2287 unsigned startOffset = 0; 2308 2288 unsigned endOffset = originalString.length(); 2309 if (_domRange) { 2310 if (&characterData == core([_domRange startContainer])) { 2311 startOffset = (NSUInteger)[_domRange startOffset]; 2312 _domRangeStartIndex = [_attrStr length]; 2313 _flags.reachedStart = YES; 2314 } 2315 if (&characterData == core([_domRange endContainer])) { 2316 endOffset = (NSUInteger)[_domRange endOffset]; 2317 _flags.reachedEnd = YES; 2318 } 2319 if ((startOffset > 0 || endOffset < originalString.length()) && endOffset >= startOffset) 2320 originalString = originalString.substring(startOffset, endOffset - startOffset); 2321 } 2289 if (&characterData == m_range->startContainer()) { 2290 startOffset = m_range->startOffset(); 2291 _domRangeStartIndex = [_attrStr length]; 2292 _flags.reachedStart = YES; 2293 } 2294 if (&characterData == m_range->endContainer()) { 2295 endOffset = m_range->endOffset(); 2296 _flags.reachedEnd = YES; 2297 } 2298 if ((startOffset > 0 || endOffset < originalString.length()) && endOffset >= startOffset) 2299 originalString = originalString.substring(startOffset, endOffset - startOffset); 2322 2300 String outputString = originalString; 2323 2301 … … 2374 2352 } 2375 2353 2376 void HTMLConverter::_traverseNode(Node *node, unsigned depth, bool embedded)2377 { 2378 if ( !node ||_flags.reachedEnd)2354 void HTMLConverter::_traverseNode(Node& node, unsigned depth, bool embedded) 2355 { 2356 if (_flags.reachedEnd) 2379 2357 return; 2380 if ( _domRange &&!_flags.reachedStart && !_caches->isAncestorsOfStartToBeConverted(node))2358 if (!_flags.reachedStart && !_caches->isAncestorsOfStartToBeConverted(node)) 2381 2359 return; 2382 2360 … … 2385 2363 bool isStart = false; 2386 2364 bool isEnd = false; 2387 if (_domRange) { 2388 if (node == core([_domRange startContainer])) { 2389 startOffset = (NSUInteger)[_domRange startOffset]; 2390 isStart = true; 2391 _flags.reachedStart = YES; 2392 } 2393 if (node == core([_domRange endContainer])) { 2394 endOffset = (NSUInteger)[_domRange endOffset]; 2395 isEnd = true; 2396 } 2397 } 2398 2399 if (node->isDocumentNode() || node->isDocumentFragment()) { 2400 Node* child = node->firstChild(); 2365 if (&node == m_range->startContainer()) { 2366 startOffset = m_range->startOffset(); 2367 isStart = true; 2368 _flags.reachedStart = YES; 2369 } 2370 if (&node == m_range->endContainer()) { 2371 endOffset = m_range->endOffset(); 2372 isEnd = true; 2373 } 2374 2375 if (node.isDocumentNode() || node.isDocumentFragment()) { 2376 Node* child = node.firstChild(); 2401 2377 for (NSUInteger i = 0; child; i++) { 2402 2378 if (isStart && i == startOffset) 2403 2379 _domRangeStartIndex = [_attrStr length]; 2404 2380 if ((!isStart || startOffset <= i) && (!isEnd || endOffset > i)) 2405 _traverseNode( child, depth + 1, embedded);2381 _traverseNode(*child, depth + 1, embedded); 2406 2382 if (isEnd && i + 1 >= endOffset) 2407 2383 _flags.reachedEnd = YES; … … 2410 2386 child = child->nextSibling(); 2411 2387 } 2412 } else if (node ->isElementNode()) {2413 DOMElement* element = kit(toElement(node));2388 } else if (node.isElementNode()) { 2389 Element& element = toElement(node); 2414 2390 if (_enterElement(element, embedded)) { 2415 2391 NSUInteger startIndex = [_attrStr length]; 2416 2392 if (_processElement(element, depth)) { 2417 Node* child = node ->firstChild();2393 Node* child = node.firstChild(); 2418 2394 for (NSUInteger i = 0; child; i++) { 2419 2395 if (isStart && i == startOffset) 2420 2396 _domRangeStartIndex = [_attrStr length]; 2421 2397 if ((!isStart || startOffset <= i) && (!isEnd || endOffset > i)) 2422 _traverseNode( child, depth + 1, embedded);2398 _traverseNode(*child, depth + 1, embedded); 2423 2399 if (isEnd && i + 1 >= endOffset) 2424 2400 _flags.reachedEnd = YES; … … 2430 2406 } 2431 2407 } 2432 } else if (node ->isCharacterDataNode())2433 _processText( *toCharacterData(node));2408 } else if (node.isCharacterDataNode()) 2409 _processText(toCharacterData(node)); 2434 2410 2435 2411 if (isEnd) … … 2437 2413 } 2438 2414 2439 void HTMLConverter::_traverseFooterNode(DOMNode *node, NSInteger depth) 2440 { 2441 DOMElement *element = (DOMElement *)node; 2442 2415 void HTMLConverter::_traverseFooterNode(Element& element, unsigned depth) 2416 { 2443 2417 if (_flags.reachedEnd) 2444 2418 return; 2445 if ( _domRange && !_flags.reachedStart && !_caches->isAncestorsOfStartToBeConverted(core(node)))2419 if (!_flags.reachedStart && !_caches->isAncestorsOfStartToBeConverted(element)) 2446 2420 return; 2447 2421 … … 2450 2424 bool isStart = false; 2451 2425 bool isEnd = false; 2452 if (_domRange) { 2453 if (node == [_domRange startContainer]) { 2454 startOffset = (NSUInteger)[_domRange startOffset]; 2455 isStart = true; 2456 _flags.reachedStart = YES; 2457 } 2458 if (node == [_domRange endContainer]) { 2459 endOffset = (NSUInteger)[_domRange endOffset]; 2460 isEnd = true; 2461 } 2462 } 2426 if (&element == m_range->startContainer()) { 2427 startOffset = m_range->startOffset(); 2428 isStart = true; 2429 _flags.reachedStart = YES; 2430 } 2431 if (&element == m_range->endContainer()) { 2432 endOffset = m_range->endOffset(); 2433 isEnd = true; 2434 } 2435 2463 2436 if (_enterElement(element, YES)) { 2464 2437 NSUInteger startIndex = [_attrStr length]; 2465 2438 if (_processElement(element, depth)) { 2466 Node* child = core(element)->firstChild();2439 Node* child = element.firstChild(); 2467 2440 for (NSUInteger i = 0; child; i++) { 2468 2441 if (isStart && i == startOffset) 2469 2442 _domRangeStartIndex = [_attrStr length]; 2470 2443 if ((!isStart || startOffset <= i) && (!isEnd || endOffset > i)) 2471 _traverseNode( child, depth + 1, true /* embedded */);2444 _traverseNode(*child, depth + 1, true /* embedded */); 2472 2445 if (isEnd && i + 1 >= endOffset) 2473 2446 _flags.reachedEnd = YES; … … 2505 2478 2506 2479 return commonAncestor; 2507 }2508 2509 void HTMLConverter::_loadFromDOMRange()2510 {2511 ASSERT(_domRange);2512 if (-1 == _errorCode) {2513 Node* commonAncestorContainer = _caches->cacheAncestorsOfStartToBeConverted(*core(_domRange));2514 ASSERT(commonAncestorContainer);2515 2516 _document = kit(commonAncestorContainer->ownerDocument());2517 _dataSource = (DocumentLoader *)core(_document)->frame()->loader().documentLoader();2518 2519 if (_document && _dataSource) {2520 _domRangeStartIndex = 0;2521 _errorCode = 0;2522 _traverseNode(commonAncestorContainer, 0, false /* embedded */);2523 if (_domRangeStartIndex > 0 && _domRangeStartIndex <= [_attrStr length])2524 [_attrStr deleteCharactersInRange:NSMakeRange(0, _domRangeStartIndex)];2525 }2526 }2527 2480 } 2528 2481 … … 2587 2540 NSAttributedString *attributedStringFromRange(Range& range) 2588 2541 { 2589 HTMLConverter converter( kit(&range));2542 HTMLConverter converter(range); 2590 2543 return converter.convert(); 2591 2544 }
Note: See TracChangeset
for help on using the changeset viewer.