Changeset 155370 in webkit


Ignore:
Timestamp:
Sep 9, 2013 12:21:53 PM (11 years ago)
Author:
Antti Koivisto
Message:

Make RenderView anonymous
https://bugs.webkit.org/show_bug.cgi?id=121013

Reviewed by Darin Adler and Dave Hyatt.

RenderView is currently the only renderer that has an associated Node that is not either Element or Text.
By making it anonymous (not have associated node, RenderView::node() returns null) we will be able to
significantly tighten typing in both render and DOM trees.

  • accessibility/AccessibilityRenderObject.cpp:

(WebCore::AccessibilityRenderObject::node):

We need to grab document() instead of node() in a few places for RenderViews to keep existing code
behaving like it did.

  • inspector/InspectorLayerTreeAgent.cpp:

(WebCore::InspectorLayerTreeAgent::buildObjectForLayer):

Don't tell inspector that the root layer is anonymous for now to avoid changing behavior.

  • rendering/RenderBlock.cpp:

(WebCore::RenderBlock::nodeForHitTest):

  • rendering/RenderBox.cpp:

(WebCore::RenderBox::canBeProgramaticallyScrolled):

The old non-virtual RenderView test renderer->node == &renderer->document() does not work anymore.
Switch to isRenderView() which is now non-virtual in a number of places.

(WebCore::RenderBox::canAutoscroll):
(WebCore::RenderBox::findAutoscrollable):
(WebCore::RenderBox::computeReplacedLogicalHeightUsing):

  • rendering/RenderBoxModelObject.cpp:

(WebCore::RenderBoxModelObject::hasAutoHeightOrContainingBlockWithAutoHeight):

  • rendering/RenderLayerBacking.cpp:

(WebCore::RenderLayerBacking::isSimpleContainerCompositingLayer):

  • rendering/RenderObject.h:

(WebCore::RenderObject::isRenderReplaced):
(WebCore::RenderObject::isAnonymousBlock):

RenderView is anonymous but not a CSS anonymous block.

(WebCore::RenderObject::isText):
(WebCore::RenderObject::isRenderView):

Make isRenderView non-virtual since it is now hot. Reuse existing bits.

(WebCore::RenderObject::setIsText):
(WebCore::RenderObject::setIsRenderView):
(WebCore::RenderObject::RenderObjectBitfields::RenderObjectBitfields):

  • rendering/RenderTreeAsText.cpp:

(WebCore::writeSelection):

  • rendering/RenderView.cpp:


Make anonymous.

(WebCore::RenderView::RenderView):

  • rendering/RenderView.h:
  • rendering/svg/RenderSVGRoot.cpp:

(WebCore::RenderSVGRoot::computeReplacedLogicalHeight):

Location:
trunk/Source/WebCore
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r155368 r155370  
     12013-09-09  Antti Koivisto  <antti@apple.com>
     2
     3        Make RenderView anonymous
     4        https://bugs.webkit.org/show_bug.cgi?id=121013
     5
     6        Reviewed by Darin Adler and Dave Hyatt.
     7
     8        RenderView is currently the only renderer that has an associated Node that is not either Element or Text.
     9        By making it anonymous (not have associated node, RenderView::node() returns null) we will be able to
     10        significantly tighten typing in both render and DOM trees.
     11
     12        * accessibility/AccessibilityRenderObject.cpp:
     13        (WebCore::AccessibilityRenderObject::node):
     14       
     15            We need to grab document() instead of node() in a few places for RenderViews to keep existing code
     16            behaving like it did.
     17
     18        * inspector/InspectorLayerTreeAgent.cpp:
     19        (WebCore::InspectorLayerTreeAgent::buildObjectForLayer):
     20       
     21            Don't tell inspector that the root layer is anonymous for now to avoid changing behavior.
     22
     23        * rendering/RenderBlock.cpp:
     24        (WebCore::RenderBlock::nodeForHitTest):
     25        * rendering/RenderBox.cpp:
     26        (WebCore::RenderBox::canBeProgramaticallyScrolled):
     27       
     28            The old non-virtual RenderView test renderer->node == &renderer->document() does not work anymore.
     29            Switch to isRenderView() which is now non-virtual in a number of places.
     30
     31        (WebCore::RenderBox::canAutoscroll):
     32        (WebCore::RenderBox::findAutoscrollable):
     33        (WebCore::RenderBox::computeReplacedLogicalHeightUsing):
     34        * rendering/RenderBoxModelObject.cpp:
     35        (WebCore::RenderBoxModelObject::hasAutoHeightOrContainingBlockWithAutoHeight):
     36        * rendering/RenderLayerBacking.cpp:
     37        (WebCore::RenderLayerBacking::isSimpleContainerCompositingLayer):
     38        * rendering/RenderObject.h:
     39        (WebCore::RenderObject::isRenderReplaced):
     40        (WebCore::RenderObject::isAnonymousBlock):
     41       
     42            RenderView is anonymous but not a CSS anonymous block.
     43
     44        (WebCore::RenderObject::isText):
     45        (WebCore::RenderObject::isRenderView):
     46       
     47            Make isRenderView non-virtual since it is now hot. Reuse existing bits.
     48
     49        (WebCore::RenderObject::setIsText):
     50        (WebCore::RenderObject::setIsRenderView):
     51        (WebCore::RenderObject::RenderObjectBitfields::RenderObjectBitfields):
     52        * rendering/RenderTreeAsText.cpp:
     53        (WebCore::writeSelection):
     54        * rendering/RenderView.cpp:
     55       
     56            Make anonymous.
     57
     58        (WebCore::RenderView::RenderView):
     59        * rendering/RenderView.h:
     60        * rendering/svg/RenderSVGRoot.cpp:
     61        (WebCore::RenderSVGRoot::computeReplacedLogicalHeight):
     62
    1632013-09-09  Bem Jones-Bey  <bjonesbe@adobe.com>
    264
  • trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp

    r155366 r155370  
    672672
    673673Node* AccessibilityRenderObject::node() const
    674 {
    675     return m_renderer ? m_renderer->node() : 0;
     674{
     675    if (!m_renderer)
     676        return 0;
     677    if (m_renderer->isRenderView())
     678        return &m_renderer->document();
     679    return m_renderer->node();
    676680}   
    677    
     681
    678682String AccessibilityRenderObject::stringValue() const
    679683{
  • trunk/Source/WebCore/inspector/InspectorLayerTreeAgent.cpp

    r154877 r155370  
    168168    bool isAnonymous = renderer->isAnonymous();
    169169
    170     if (isReflection && isGenerated)
     170    if (renderer->isRenderView())
     171        node = &renderer->document();
     172    else if (isReflection && isGenerated)
    171173        node = renderer->parent()->generatingNode();
    172174    else if (isGenerated)
     
    201203    }
    202204
    203     if (isAnonymous) {
     205    // FIXME: RenderView is now really anonymous but don't tell about it to the frontend before making sure it can handle it.
     206    if (isAnonymous && !renderer->isRenderView()) {
    204207        layerObject->setIsAnonymous(true);
    205208        if (RenderStyle* style = renderer->style()) {
  • trunk/Source/WebCore/rendering/RenderBlock.cpp

    r155368 r155370  
    51665166    // continuation we're actually still inside the enclosing element
    51675167    // that was split. Use the appropriate inner node.
     5168    if (isRenderView())
     5169        return &document();
    51685170    return isAnonymousBlockContinuation() ? continuation()->node() : node();
    51695171}
  • trunk/Source/WebCore/rendering/RenderBox.cpp

    r155366 r155370  
    802802bool RenderBox::canBeProgramaticallyScrolled() const
    803803{
    804     Node* node = this->node();
    805     if (node && node->isDocumentNode())
     804    if (isRenderView())
    806805        return true;
    807806
     
    813812        return true;
    814813
     814    Node* node = this->node();
    815815    return node && node->rendererIsEditable();
    816816}
     
    830830bool RenderBox::canAutoscroll() const
    831831{
    832     if (node() && node()->isDocumentNode())
     832    if (isRenderView())
    833833        return view().frameView().isScrollable();
    834834
     
    863863{
    864864    while (renderer && !(renderer->isBox() && toRenderBox(renderer)->canAutoscroll())) {
    865         if (!renderer->parent() && renderer->node() == &renderer->document() && renderer->document().ownerElement())
     865        if (renderer->isRenderView() && renderer->document().ownerElement())
    866866            renderer = renderer->document().ownerElement()->renderer();
    867867        else
     
    28442844        {
    28452845            RenderObject* cb = isOutOfFlowPositioned() ? container() : containingBlock();
    2846             while (cb->isAnonymous()) {
     2846            while (cb->isAnonymous() && !cb->isRenderView()) {
    28472847                cb = cb->containingBlock();
    28482848                toRenderBlock(cb)->addPercentHeightDescendant(const_cast<RenderBox*>(this));
  • trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp

    r155318 r155370  
    229229    // the closest non-anonymous ancestor box is used instead.
    230230    RenderBlock* cb = containingBlock();
    231     while (cb->isAnonymous())
     231    while (cb->isAnonymous() && !cb->isRenderView())
    232232        cb = cb->containingBlock();
    233233
  • trunk/Source/WebCore/rendering/RenderLayerBacking.cpp

    r155119 r155370  
    15691569        return false;
    15701570
    1571     if (renderer().node() && renderer().node()->isDocumentNode()) {
     1571    if (renderer().isRenderView()) {
    15721572        // Look to see if the root object has a non-simple background
    15731573        RenderObject* rootObject = renderer().document().documentElement() ? renderer().document().documentElement()->renderer() : 0;
  • trunk/Source/WebCore/rendering/RenderObject.h

    r155366 r155370  
    359359    virtual bool isRenderRegion() const { return false; }
    360360    virtual bool isRenderReplaced() const { return false; }
    361     virtual bool isRenderView() const { return false; }
    362361    virtual bool isReplica() const { return false; }
    363362
     
    522521        // RenderBlock having a BLOCK or BOX display. Other classes such as RenderTextFragment
    523522        // are not RenderBlocks and will return false. See https://bugs.webkit.org/show_bug.cgi?id=56709.
    524         return isAnonymous() && (style()->display() == BLOCK || style()->display() == BOX) && style()->styleType() == NOPSEUDO && isRenderBlock() && !isListMarker() && !isRenderFlowThread()
     523        return isAnonymous() && (style()->display() == BLOCK || style()->display() == BOX) && style()->styleType() == NOPSEUDO && isRenderBlock() && !isListMarker() && !isRenderFlowThread() && !isRenderView()
    525524#if ENABLE(FULLSCREEN_API)
    526525            && !isRenderFullScreen()
     
    547546    bool isPositioned() const { return m_bitfields.isPositioned(); }
    548547
    549     bool isText() const  { return m_bitfields.isText(); }
     548    bool isText() const  { return !m_bitfields.isBox() && m_bitfields.isTextOrRenderView(); }
    550549    bool isBox() const { return m_bitfields.isBox(); }
     550    bool isRenderView() const  { return m_bitfields.isBox() && m_bitfields.isTextOrRenderView(); }
    551551    bool isInline() const { return m_bitfields.isInline(); } // inline object
    552552    bool isRunIn() const { return style()->display() == RUN_IN; } // run-in object
     
    681681    virtual bool computeBackgroundIsKnownToBeObscured() { return false; }
    682682
    683     void setIsText() { m_bitfields.setIsText(true); }
     683    void setIsText() { ASSERT(!isBox()); m_bitfields.setIsTextOrRenderView(true); }
    684684    void setIsBox() { m_bitfields.setIsBox(true); }
     685    void setIsRenderView() { ASSERT(isBox()); m_bitfields.setIsTextOrRenderView(true); }
    685686    void setReplaced(bool b = true) { m_bitfields.setIsReplaced(b); }
    686687    void setHorizontalWritingMode(bool b = true) { m_bitfields.setHorizontalWritingMode(b); }
     
    10761077            , m_floating(false)
    10771078            , m_isAnonymous(!node)
    1078             , m_isText(false)
     1079            , m_isTextOrRenderView(false)
    10791080            , m_isBox(false)
    10801081            , m_isInline(true)
     
    11071108
    11081109        ADD_BOOLEAN_BITFIELD(isAnonymous, IsAnonymous);
    1109         ADD_BOOLEAN_BITFIELD(isText, IsText);
     1110        ADD_BOOLEAN_BITFIELD(isTextOrRenderView, IsTextOrRenderView);
    11101111        ADD_BOOLEAN_BITFIELD(isBox, IsBox);
    11111112        ADD_BOOLEAN_BITFIELD(isInline, IsInline);
  • trunk/Source/WebCore/rendering/RenderTreeAsText.cpp

    r155109 r155370  
    836836}
    837837
    838 static void writeSelection(TextStream& ts, const RenderObject* o)
    839 {
    840     Node* n = o->node();
    841     if (!n || !n->isDocumentNode())
    842         return;
    843 
    844     Document* doc = toDocument(n);
    845     Frame* frame = doc->frame();
     838static void writeSelection(TextStream& ts, const RenderObject* renderer)
     839{
     840    if (!renderer->isRenderView())
     841        return;
     842
     843    Frame* frame = renderer->document().frame();
    846844    if (!frame)
    847845        return;
  • trunk/Source/WebCore/rendering/RenderView.cpp

    r155301 r155370  
    5858
    5959RenderView::RenderView(Document* document)
    60     : RenderBlockFlow(document)
     60    : RenderBlockFlow(0)
    6161    , m_frameView(*document->view())
    6262    , m_selectionStart(0)
     
    7676#endif
    7777{
     78    setIsRenderView();
     79    setDocumentForAnonymous(document);
     80
    7881    // FIXME: We should find a way to enforce this at compile time.
    7982    ASSERT(document->view());
  • trunk/Source/WebCore/rendering/RenderView.h

    r155366 r155370  
    5454    virtual const char* renderName() const OVERRIDE { return "RenderView"; }
    5555
    56     virtual bool isRenderView() const OVERRIDE { return true; }
    57 
    5856    virtual bool requiresLayer() const OVERRIDE { return true; }
    5957
  • trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp

    r154580 r155370  
    186186            RenderBlock* cb = containingBlock();
    187187            ASSERT(cb);
    188             while (cb->isAnonymous()) {
     188            while (cb->isAnonymous() && !cb->isRenderView()) {
    189189                cb = cb->containingBlock();
    190190                cb->addPercentHeightDescendant(const_cast<RenderSVGRoot*>(this));
Note: See TracChangeset for help on using the changeset viewer.