Skip to content
  • mjs@apple.com's avatar
    WebCore: · bf259502
    mjs@apple.com authored
    2008-05-29  Maciej Stachowiak  <mjs@apple.com>
    
            Reviewed by Dave Hyatt.
    
            - speed up DHTML using lazy style resolution and rendere creation
    
            This change introduces the concept of "lazy attach" - when a node
            is lazy attached, then instead of resolving style and creating a
            renderer right away, we just mark it as needing a style recalc.
            
            The patch makes use of this mechanism when inserting nodes directly
            using DOM APIs from script. For now this is only done for the
            JavaScript language binding but could also be done for other
            bindings in the future.
            
            Lazy attach helps some common DHTML patterns - when a node is
            added to the DOM, and then subsequently changed in a
            style-affecting way, this causes an extra style recalc. This is a
            fairly common pattern so it is better to be lazy.
            
            * bindings/js/JSNodeCustom.cpp:
            (WebCore::JSNode::insertBefore): Request lazy attach.
            (WebCore::JSNode::replaceChild): ditto
            (WebCore::JSNode::appendChild): ditto
            * dom/ContainerNode.cpp:
            (WebCore::ContainerNode::insertBefore): Support lazy attach.
            (WebCore::ContainerNode::replaceChild): ditto
            (WebCore::ContainerNode::appendChild): ditto
            (WebCore::ContainerNode::detach): Clear "changed child" bit if still set.
            * dom/ContainerNode.h:
            * dom/Element.cpp:
            (WebCore::Element::recalcStyle): Adjusted to properly reattach a
            lazy-attached node.
            * dom/Node.cpp:
            (WebCore::Node::insertBefore): Extra parameter for lazy attach
            (still doesn't do anything).
            (WebCore::Node::replaceChild): ditto
            (WebCore::Node::appendChild): ditto
            (WebCore::Node::setChanged): Unrelated but obvious optimization -
            stop marking ancestor as having a changed child once we already reach
            an ancestor so marked.
            (WebCore::outermostLazyAttachedAncestor): Helper function for lazyAttach.
            (WebCore::Node::lazyAttach): Implement lazy attach.
            (WebCore::Node::canLazyAttach): Virtual method - true for most nodes.
            * dom/Node.h:
            * dom/Text.cpp:
            (WebCore::Text::recalcStyle): Properly handle the case of a reattached node.
            * html/HTMLEmbedElement.h:
            (WebCore::HTMLEmbedElement::canLazyAttach): Refuse lazy attach, since
            plugins and frames do important work at rederer creation time.
            * html/HTMLFrameElementBase.h:
            (WebCore::HTMLFrameElementBase::canLazyAttach): Refuse lazy attach, since
            plugins and frames do important work at rederer creation time.
            * html/HTMLFrameSetElement.cpp:
            (WebCore::HTMLFrameSetElement::recalcStyle): Change order so that
            reattach works properly.
            * html/HTMLObjectElement.h:
            (WebCore::HTMLObjectElement::canLazyAttach): Refuse lazy attach, since
            plugins and frames do important work at rederer creation time.
            * html/HTMLOptGroupElement.cpp:
            (WebCore::HTMLOptGroupElement::insertBefore): Pass along extra param.
            (WebCore::HTMLOptGroupElement::replaceChild): ditto
            (WebCore::HTMLOptGroupElement::appendChild): ditto
            * html/HTMLOptGroupElement.h:
            * html/HTMLSelectElement.cpp:
            (WebCore::HTMLSelectElement::insertBefore): Pass along extra param.
            (WebCore::HTMLSelectElement::replaceChild): ditto
            (WebCore::HTMLSelectElement::appendChild): ditto
            * html/HTMLSelectElement.h:
            * svg/SVGLocatable.cpp:
            (WebCore::SVGLocatable::getBBox): Add missing updateLayout call.
            * svg/SVGTextContentElement.cpp:
            (WebCore::SVGTextContentElement::getNumberOfChars): ditto
            (WebCore::SVGTextContentElement::getComputedTextLength): ditto
            (WebCore::SVGTextContentElement::getSubStringLength): ditto
            (WebCore::SVGTextContentElement::getStartPositionOfChar): ditto
            (WebCore::SVGTextContentElement::getEndPositionOfChar): ditto
            (WebCore::SVGTextContentElement::getExtentOfChar): ditto
            (WebCore::SVGTextContentElement::getRotationOfChar): ditto
            (WebCore::SVGTextContentElement::getCharNumAtPosition): ditto
    
    LayoutTests:
    
    2008-05-29  Maciej Stachowiak  <mjs@apple.com>
    
            Reviewed by Dave Hyatt.
    
            - Test cases for this change: "speed up DHTML using lazy style resolution and rendere creation"
    
            * http/tests/misc/acid3-expected.txt:
            * platform/mac/fast/dynamic/insert-before-table-part-in-continuation-expected.checksum:
            * platform/mac/fast/dynamic/insert-before-table-part-in-continuation-expected.png:
            * platform/mac/fast/dynamic/insert-before-table-part-in-continuation-expected.txt:
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@34193 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    bf259502