Changeset 165761 in webkit


Ignore:
Timestamp:
Mar 17, 2014 2:36:43 PM (10 years ago)
Author:
rniwa@webkit.org
Message:

[Mac] Rewrite WebHTMLConverter::_computedStringForNode in C++
https://bugs.webkit.org/show_bug.cgi?id=130274

Reviewed by Andreas Kling.

Rewrote WebHTMLConverter::_computedStringForNode as HTMLConverterCaches::propertyValueForNode.

  • platform/mac/HTMLConverter.h: Removed unused caches.
  • platform/mac/HTMLConverter.mm:

(HTMLConverterCaches::computedStylePropertyForElement): Added use const String& instead of String& on property name.
(HTMLConverterCaches::inlineStylePropertyForElement): Ditto.
(HTMLConverterCaches::propertyValueForNode): Renamed and rewritten from _computedStringForNode.
(-[WebHTMLConverter _stringForNode:property:]): Simply return the computed value instead of storing it in the cache
now that the computing the value is fast.
(-[WebHTMLConverter dealloc]):
(-[WebHTMLConverter init]):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r165757 r165761  
     12014-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
    1202014-03-17  Andreas Kling  <akling@apple.com>
    221
  • trunk/Source/WebCore/platform/mac/HTMLConverter.h

    r165635 r165761  
    5757    NSMutableArray *_textTableRowArrays;
    5858    NSMutableArray *_textTableRowBackgroundColors;
    59     NSMutableDictionary *_specifiedStylesForElements;
    60     NSMutableDictionary *_stringsForNodes;
    6159    NSMutableDictionary *_floatsForNodes;
    6260    NSMutableDictionary *_colorsForNodes;
  • trunk/Source/WebCore/platform/mac/HTMLConverter.mm

    r165699 r165761  
    402402class HTMLConverterCaches {
    403403public:
    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&);
    406408
    407409private:
     
    563565}
    564566
    565 PassRefPtr<CSSValue> HTMLConverterCaches::computedStylePropertyForElement(Element& element, String& propertyName)
     567PassRefPtr<CSSValue> HTMLConverterCaches::computedStylePropertyForElement(Element& element, const String& propertyName)
    566568{
    567569    CSSPropertyID propetyId = cssPropertyID(propertyName);
     
    576578}
    577579
    578 PassRefPtr<CSSValue> HTMLConverterCaches::inlineStylePropertyForElement(Element& element, String& propertyName)
     580PassRefPtr<CSSValue> HTMLConverterCaches::inlineStylePropertyForElement(Element& element, const String& propertyName)
    579581{
    580582    CSSPropertyID propetyId = cssPropertyID(propertyName);
     
    606608}
    607609
    608 - (NSString *)_computedStringForNode:(DOMNode *)node property:(NSString *)key
    609 {
    610     bool haveResult = false;
    611     String result;
    612     bool inherit = true;
     610String 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{
    613730    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;
    733736    return result;
    734737}
     
    24212424    [_textTableRowArrays release];
    24222425    [_textTableRowBackgroundColors release];
    2423     [_specifiedStylesForElements release];
    2424     [_stringsForNodes release];
    24252426    [_floatsForNodes release];
    24262427    [_colorsForNodes release];
     
    24502451    _textTableRowArrays = [[NSMutableArray alloc] init];
    24512452    _textTableRowBackgroundColors = [[NSMutableArray alloc] init];
    2452     _specifiedStylesForElements = [[NSMutableDictionary alloc] init];
    2453     _stringsForNodes = [[NSMutableDictionary alloc] init];
    24542453    _floatsForNodes = [[NSMutableDictionary alloc] init];
    24552454    _colorsForNodes = [[NSMutableDictionary alloc] init];
Note: See TracChangeset for help on using the changeset viewer.