Changeset 165761 in webkit
- Timestamp:
- Mar 17, 2014 2:36:43 PM (10 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r165757 r165761 1 2014-03-17 Ryosuke Niwa <rniwa@webkit.org> 2 3 [Mac] Rewrite WebHTMLConverter::_computedStringForNode in C++ 4 https://bugs.webkit.org/show_bug.cgi?id=130274 5 6 Reviewed by Andreas Kling. 7 8 Rewrote WebHTMLConverter::_computedStringForNode as HTMLConverterCaches::propertyValueForNode. 9 10 * platform/mac/HTMLConverter.h: Removed unused caches. 11 * platform/mac/HTMLConverter.mm: 12 (HTMLConverterCaches::computedStylePropertyForElement): Added use const String& instead of String& on property name. 13 (HTMLConverterCaches::inlineStylePropertyForElement): Ditto. 14 (HTMLConverterCaches::propertyValueForNode): Renamed and rewritten from _computedStringForNode. 15 (-[WebHTMLConverter _stringForNode:property:]): Simply return the computed value instead of storing it in the cache 16 now that the computing the value is fast. 17 (-[WebHTMLConverter dealloc]): 18 (-[WebHTMLConverter init]): 19 1 20 2014-03-17 Andreas Kling <akling@apple.com> 2 21 -
trunk/Source/WebCore/platform/mac/HTMLConverter.h
r165635 r165761 57 57 NSMutableArray *_textTableRowArrays; 58 58 NSMutableArray *_textTableRowBackgroundColors; 59 NSMutableDictionary *_specifiedStylesForElements;60 NSMutableDictionary *_stringsForNodes;61 59 NSMutableDictionary *_floatsForNodes; 62 60 NSMutableDictionary *_colorsForNodes; -
trunk/Source/WebCore/platform/mac/HTMLConverter.mm
r165699 r165761 402 402 class HTMLConverterCaches { 403 403 public: 404 PassRefPtr<CSSValue> computedStylePropertyForElement(Element&, String&); 405 PassRefPtr<CSSValue> inlineStylePropertyForElement(Element&, String&); 404 String propertyValueForNode(Node&, const String& propertyName); 405 406 PassRefPtr<CSSValue> computedStylePropertyForElement(Element&, const String&); 407 PassRefPtr<CSSValue> inlineStylePropertyForElement(Element&, const String&); 406 408 407 409 private: … … 563 565 } 564 566 565 PassRefPtr<CSSValue> HTMLConverterCaches::computedStylePropertyForElement(Element& element, String& propertyName)567 PassRefPtr<CSSValue> HTMLConverterCaches::computedStylePropertyForElement(Element& element, const String& propertyName) 566 568 { 567 569 CSSPropertyID propetyId = cssPropertyID(propertyName); … … 576 578 } 577 579 578 PassRefPtr<CSSValue> HTMLConverterCaches::inlineStylePropertyForElement(Element& element, String& propertyName)580 PassRefPtr<CSSValue> HTMLConverterCaches::inlineStylePropertyForElement(Element& element, const String& propertyName) 579 581 { 580 582 CSSPropertyID propetyId = cssPropertyID(propertyName); … … 606 608 } 607 609 608 - (NSString *)_computedStringForNode:(DOMNode *)node property:(NSString *)key 609 { 610 bool haveResult = false; 611 String result; 612 bool inherit = true; 610 String HTMLConverterCaches::propertyValueForNode(Node& node, const String& propertyName) 611 { 612 if (!node.isElementNode()) { 613 if (Node* parent = node.parentNode()) 614 return propertyValueForNode(*parent, propertyName); 615 return String(); 616 } 617 618 bool inherit = false; 619 Element& element = toElement(node); 620 if (RefPtr<CSSValue> value = computedStylePropertyForElement(element, propertyName)) { 621 String result; 622 if (stringFromCSSValue(*value, result)) 623 return result; 624 } 625 626 if (RefPtr<CSSValue> value = inlineStylePropertyForElement(element, propertyName)) { 627 String result; 628 if (value->isInheritedValue()) 629 inherit = true; 630 else if (stringFromCSSValue(*value, result)) 631 return result; 632 } 633 634 switch (cssPropertyID(propertyName)) { 635 case CSSPropertyDisplay: 636 if (element.hasTagName(headTag) || element.hasTagName(scriptTag) || element.hasTagName(appletTag) || element.hasTagName(noframesTag)) 637 return "none"; 638 else if (element.hasTagName(addressTag) || element.hasTagName(blockquoteTag) || element.hasTagName(bodyTag) || element.hasTagName(centerTag) 639 || element.hasTagName(ddTag) || element.hasTagName(dirTag) || element.hasTagName(divTag) || element.hasTagName(dlTag) 640 || element.hasTagName(dtTag) || element.hasTagName(fieldsetTag) || element.hasTagName(formTag) || element.hasTagName(frameTag) 641 || element.hasTagName(framesetTag) || element.hasTagName(hrTag) || element.hasTagName(htmlTag) || element.hasTagName(h1Tag) 642 || element.hasTagName(h2Tag) || element.hasTagName(h3Tag) || element.hasTagName(h4Tag) || element.hasTagName(h5Tag) 643 || element.hasTagName(h6Tag) || element.hasTagName(iframeTag) || element.hasTagName(menuTag) || element.hasTagName(noscriptTag) 644 || element.hasTagName(olTag) || element.hasTagName(pTag) || element.hasTagName(preTag) || element.hasTagName(ulTag)) 645 return "block"; 646 else if (element.hasTagName(liTag)) 647 return "list-item"; 648 else if (element.hasTagName(tableTag)) 649 return "table"; 650 else if (element.hasTagName(trTag)) 651 return "table-row"; 652 else if (element.hasTagName(thTag) || element.hasTagName(tdTag)) 653 return "table-cell"; 654 else if (element.hasTagName(theadTag)) 655 return "table-header-group"; 656 else if (element.hasTagName(tbodyTag)) 657 return "table-row-group"; 658 else if (element.hasTagName(tfootTag)) 659 return "table-footer-group"; 660 else if (element.hasTagName(colTag)) 661 return "table-column"; 662 else if (element.hasTagName(colgroupTag)) 663 return "table-column-group"; 664 else if (element.hasTagName(captionTag)) 665 return "table-caption"; 666 break; 667 case CSSPropertyWhiteSpace: 668 if (element.hasTagName(preTag)) 669 return "pre"; 670 inherit = true; 671 break; 672 case CSSPropertyFontStyle: 673 if (element.hasTagName(iTag) || element.hasTagName(citeTag) || element.hasTagName(emTag) || element.hasTagName(varTag) || element.hasTagName(addressTag)) 674 return "italic"; 675 inherit = true; 676 break; 677 case CSSPropertyFontWeight: 678 if (element.hasTagName(bTag) || element.hasTagName(strongTag) || element.hasTagName(thTag)) 679 return "bolder"; 680 inherit = true; 681 break; 682 case CSSPropertyTextDecoration: 683 if (element.hasTagName(uTag) || element.hasTagName(insTag)) 684 return "underline"; 685 else if (element.hasTagName(sTag) || element.hasTagName(strikeTag) || element.hasTagName(delTag)) 686 return "line-through"; 687 inherit = true; // FIXME: This is not strictly correct 688 break; 689 case CSSPropertyTextAlign: 690 if (element.hasTagName(centerTag) || element.hasTagName(captionTag) || element.hasTagName(thTag)) 691 return "center"; 692 inherit = true; 693 break; 694 case CSSPropertyVerticalAlign: 695 if (element.hasTagName(supTag)) 696 return "super"; 697 else if (element.hasTagName(subTag)) 698 return "sub"; 699 else if (element.hasTagName(theadTag) || element.hasTagName(tbodyTag) || element.hasTagName(tfootTag)) 700 return "middle"; 701 else if (element.hasTagName(trTag) || element.hasTagName(thTag) || element.hasTagName(tdTag)) 702 inherit = true; 703 break; 704 case CSSPropertyFontFamily: 705 case CSSPropertyFontVariant: 706 case CSSPropertyTextTransform: 707 case CSSPropertyTextShadow: 708 case CSSPropertyVisibility: 709 case CSSPropertyBorderCollapse: 710 case CSSPropertyEmptyCells: 711 case CSSPropertyWordSpacing: 712 case CSSPropertyListStyleType: 713 case CSSPropertyDirection: 714 inherit = true; // FIXME: Let classes in the css component figure this out. 715 break; 716 default: 717 break; 718 } 719 720 if (inherit) { 721 if (Node* parent = node.parentNode()) 722 return propertyValueForNode(*parent, propertyName); 723 } 724 725 return String(); 726 } 727 728 - (NSString *)_stringForNode:(DOMNode *)node property:(NSString *)key 729 { 613 730 Node* coreNode = core(node); 614 if (coreNode && coreNode->isElementNode()) { 615 Element& element = toElement(*coreNode); 616 String propertyName = key; 617 inherit = false; 618 if (!haveResult) { 619 if (RefPtr<CSSValue> value = _caches->computedStylePropertyForElement(element, propertyName)) 620 haveResult = stringFromCSSValue(*value, result); 621 } 622 if (!haveResult) { 623 if (RefPtr<CSSValue> value = _caches->computedStylePropertyForElement(element, propertyName)) { 624 if (value->isInheritedValue()) 625 inherit = true; 626 else 627 haveResult = stringFromCSSValue(*value, result); 628 } 629 } 630 Element* coreElement = &element; 631 if (!haveResult) { 632 if ([@"display" isEqualToString:key]) { 633 if (coreElement->hasTagName(headTag) || coreElement->hasTagName(scriptTag) || coreElement->hasTagName(appletTag) || coreElement->hasTagName(noframesTag)) 634 result = "none"; 635 else if (coreElement->hasTagName(addressTag) || coreElement->hasTagName(blockquoteTag) || coreElement->hasTagName(bodyTag) || coreElement->hasTagName(centerTag) 636 || coreElement->hasTagName(ddTag) || coreElement->hasTagName(dirTag) || coreElement->hasTagName(divTag) || coreElement->hasTagName(dlTag) 637 || coreElement->hasTagName(dtTag) || coreElement->hasTagName(fieldsetTag) || coreElement->hasTagName(formTag) || coreElement->hasTagName(frameTag) 638 || coreElement->hasTagName(framesetTag) || coreElement->hasTagName(hrTag) || coreElement->hasTagName(htmlTag) || coreElement->hasTagName(h1Tag) 639 || coreElement->hasTagName(h2Tag) || coreElement->hasTagName(h3Tag) || coreElement->hasTagName(h4Tag) || coreElement->hasTagName(h5Tag) 640 || coreElement->hasTagName(h6Tag) || coreElement->hasTagName(iframeTag) || coreElement->hasTagName(menuTag) || coreElement->hasTagName(noscriptTag) 641 || coreElement->hasTagName(olTag) || coreElement->hasTagName(pTag) || coreElement->hasTagName(preTag) || coreElement->hasTagName(ulTag)) 642 result = "block"; 643 else if (coreElement->hasTagName(liTag)) 644 result = "list-item"; 645 else if (coreElement->hasTagName(tableTag)) 646 result = "table"; 647 else if (coreElement->hasTagName(trTag)) 648 result = "table-row"; 649 else if (coreElement->hasTagName(thTag) || coreElement->hasTagName(tdTag)) 650 result = "table-cell"; 651 else if (coreElement->hasTagName(theadTag)) 652 result = "table-header-group"; 653 else if (coreElement->hasTagName(tbodyTag)) 654 result = "table-row-group"; 655 else if (coreElement->hasTagName(tfootTag)) 656 result = "table-footer-group"; 657 else if (coreElement->hasTagName(colTag)) 658 result = "table-column"; 659 else if (coreElement->hasTagName(colgroupTag)) 660 result = "table-column-group"; 661 else if (coreElement->hasTagName(captionTag)) 662 result = "table-caption"; 663 } else if ([@"white-space" isEqualToString:key]) { 664 if (coreElement->hasTagName(preTag)) 665 result = "pre"; 666 else 667 inherit = YES; 668 } else if ([@"font-style" isEqualToString:key]) { 669 if (coreElement->hasTagName(iTag) || coreElement->hasTagName(citeTag) || coreElement->hasTagName(emTag) || coreElement->hasTagName(varTag) || coreElement->hasTagName(addressTag)) 670 result = "italic"; 671 else 672 inherit = YES; 673 } else if ([@"font-weight" isEqualToString:key]) { 674 if (coreElement->hasTagName(bTag) || coreElement->hasTagName(strongTag) || coreElement->hasTagName(thTag)) 675 result = "bolder"; 676 else 677 inherit = YES; 678 } else if ([@"text-decoration" isEqualToString:key]) { 679 if (coreElement->hasTagName(uTag) || coreElement->hasTagName(insTag)) 680 result = "underline"; 681 else if (coreElement->hasTagName(sTag) || coreElement->hasTagName(strikeTag) || coreElement->hasTagName(delTag)) 682 result = "line-through"; 683 else 684 inherit = YES; // ??? this is not strictly correct 685 } else if ([@"text-align" isEqualToString:key]) { 686 if (coreElement->hasTagName(centerTag) || coreElement->hasTagName(captionTag) || coreElement->hasTagName(thTag)) 687 result = "center"; 688 else 689 inherit = YES; 690 } else if ([@"vertical-align" isEqualToString:key]) { 691 if (coreElement->hasTagName(supTag)) 692 result = "super"; 693 else if (coreElement->hasTagName(subTag)) 694 result = "sub"; 695 else if (coreElement->hasTagName(theadTag) || coreElement->hasTagName(tbodyTag) || coreElement->hasTagName(tfootTag)) 696 result = "middle"; 697 else if (coreElement->hasTagName(trTag) || coreElement->hasTagName(thTag) || coreElement->hasTagName(tdTag)) 698 inherit = YES; 699 } else if ([@"font-family" isEqualToString:key] || [@"font-variant" isEqualToString:key] || [@"font-effect" isEqualToString:key] 700 || [@"text-transform" isEqualToString:key] || [@"text-shadow" isEqualToString:key] || [@"visibility" isEqualToString:key] 701 || [@"border-collapse" isEqualToString:key] || [@"empty-cells" isEqualToString:key] || [@"word-spacing" isEqualToString:key] 702 || [@"list-style-type" isEqualToString:key] || [@"direction" isEqualToString:key]) { 703 inherit = YES; 704 } 705 } 706 } 707 if (!haveResult && inherit) { 708 DOMNode *parentNode = [node parentNode]; 709 if (parentNode) 710 return [self _stringForNode:parentNode property:key]; 711 } 712 if (haveResult) 713 return result.lower(); 714 return nil; 715 } 716 717 - (NSString *)_stringForNode:(DOMNode *)node property:(NSString *)key 718 { 719 NSString *result = nil; 720 RetainPtr<NSMutableDictionary> attributeDictionary = [_stringsForNodes objectForKey:node]; 721 if (!attributeDictionary) { 722 attributeDictionary = adoptNS([[NSMutableDictionary alloc] init]); 723 [_stringsForNodes setObject:attributeDictionary.get() forKey:node]; 724 } 725 result = [attributeDictionary objectForKey:key]; 726 if (result) { 727 if ([result isEqualToString:@""]) 728 result = nil; 729 } else { 730 result = [self _computedStringForNode:node property:key]; 731 [attributeDictionary setObject:(result ? result : @"") forKey:key]; 732 } 731 if (!coreNode) 732 return nil; 733 String result = _caches->propertyValueForNode(*coreNode, String(key)); 734 if (!result.length()) 735 return nil; 733 736 return result; 734 737 } … … 2421 2424 [_textTableRowArrays release]; 2422 2425 [_textTableRowBackgroundColors release]; 2423 [_specifiedStylesForElements release];2424 [_stringsForNodes release];2425 2426 [_floatsForNodes release]; 2426 2427 [_colorsForNodes release]; … … 2450 2451 _textTableRowArrays = [[NSMutableArray alloc] init]; 2451 2452 _textTableRowBackgroundColors = [[NSMutableArray alloc] init]; 2452 _specifiedStylesForElements = [[NSMutableDictionary alloc] init];2453 _stringsForNodes = [[NSMutableDictionary alloc] init];2454 2453 _floatsForNodes = [[NSMutableDictionary alloc] init]; 2455 2454 _colorsForNodes = [[NSMutableDictionary alloc] init];
Note: See TracChangeset
for help on using the changeset viewer.