Changeset 111376 in webkit


Ignore:
Timestamp:
Mar 20, 2012 3:08:26 AM (12 years ago)
Author:
mihnea@adobe.com
Message:

[CSSRegions]Implement NamedFlow::getRegionsByContentNode
https://bugs.webkit.org/show_bug.cgi?id=77746

Reviewed by David Hyatt.

The list of regions returned is a static node list.

Source/WebCore:

Tests: fast/regions/get-regions-by-content-node-horiz-bt.html

fast/regions/get-regions-by-content-node-horiz-tb.html
fast/regions/get-regions-by-content-node-vert-lr.html
fast/regions/get-regions-by-content-node-vert-rl.html
fast/regions/get-regions-by-content-node.html
fast/regions/get-regions-by-content-node2.html

  • dom/WebKitNamedFlow.cpp:

(WebCore::WebKitNamedFlow::getRegionsByContentNode):
(WebCore):

  • dom/WebKitNamedFlow.h:

(WebKitNamedFlow):

  • dom/WebKitNamedFlow.idl:
  • rendering/RenderFlowThread.cpp:

(WebCore::RenderFlowThread::regionInRange):
(WebCore):
(WebCore::RenderFlowThread::objectInFlowRegion):

  • rendering/RenderFlowThread.h:
  • rendering/RenderRegion.h:

(WebCore::RenderRegion::flowThread):

LayoutTests:

  • fast/regions/get-regions-by-content-node-expected.txt: Added.
  • fast/regions/get-regions-by-content-node-horiz-bt-expected.txt: Added.
  • fast/regions/get-regions-by-content-node-horiz-bt.html: Added.
  • fast/regions/get-regions-by-content-node-horiz-tb-expected.txt: Added.
  • fast/regions/get-regions-by-content-node-horiz-tb.html: Added.
  • fast/regions/get-regions-by-content-node-vert-lr-expected.txt: Added.
  • fast/regions/get-regions-by-content-node-vert-lr.html: Added.
  • fast/regions/get-regions-by-content-node-vert-rl-expected.txt: Added.
  • fast/regions/get-regions-by-content-node-vert-rl.html: Added.
  • fast/regions/get-regions-by-content-node.html: Added.
  • fast/regions/get-regions-by-content-node2-expected.txt: Added.
  • fast/regions/get-regions-by-content-node2.html: Added.
Location:
trunk
Files:
12 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r111374 r111376  
     12012-03-20  Mihnea Ovidenie  <mihnea@adobe.com>
     2
     3        [CSSRegions]Implement NamedFlow::getRegionsByContentNode
     4        https://bugs.webkit.org/show_bug.cgi?id=77746
     5
     6        Reviewed by David Hyatt.
     7
     8        The list of regions returned is a static node list.
     9
     10        * fast/regions/get-regions-by-content-node-expected.txt: Added.
     11        * fast/regions/get-regions-by-content-node-horiz-bt-expected.txt: Added.
     12        * fast/regions/get-regions-by-content-node-horiz-bt.html: Added.
     13        * fast/regions/get-regions-by-content-node-horiz-tb-expected.txt: Added.
     14        * fast/regions/get-regions-by-content-node-horiz-tb.html: Added.
     15        * fast/regions/get-regions-by-content-node-vert-lr-expected.txt: Added.
     16        * fast/regions/get-regions-by-content-node-vert-lr.html: Added.
     17        * fast/regions/get-regions-by-content-node-vert-rl-expected.txt: Added.
     18        * fast/regions/get-regions-by-content-node-vert-rl.html: Added.
     19        * fast/regions/get-regions-by-content-node.html: Added.
     20        * fast/regions/get-regions-by-content-node2-expected.txt: Added.
     21        * fast/regions/get-regions-by-content-node2.html: Added.
     22
    1232012-03-20  Keishi Hattori  <keishi@webkit.org>
    224
  • trunk/Source/WebCore/ChangeLog

    r111371 r111376  
     12012-03-20  Mihnea Ovidenie  <mihnea@adobe.com>
     2
     3        [CSSRegions]Implement NamedFlow::getRegionsByContentNode
     4        https://bugs.webkit.org/show_bug.cgi?id=77746
     5
     6        Reviewed by David Hyatt.
     7
     8        The list of regions returned is a static node list.
     9
     10        Tests: fast/regions/get-regions-by-content-node-horiz-bt.html
     11               fast/regions/get-regions-by-content-node-horiz-tb.html
     12               fast/regions/get-regions-by-content-node-vert-lr.html
     13               fast/regions/get-regions-by-content-node-vert-rl.html
     14               fast/regions/get-regions-by-content-node.html
     15               fast/regions/get-regions-by-content-node2.html
     16
     17        * dom/WebKitNamedFlow.cpp:
     18        (WebCore::WebKitNamedFlow::getRegionsByContentNode):
     19        (WebCore):
     20        * dom/WebKitNamedFlow.h:
     21        (WebKitNamedFlow):
     22        * dom/WebKitNamedFlow.idl:
     23        * rendering/RenderFlowThread.cpp:
     24        (WebCore::RenderFlowThread::regionInRange):
     25        (WebCore):
     26        (WebCore::RenderFlowThread::objectInFlowRegion):
     27        * rendering/RenderFlowThread.h:
     28        * rendering/RenderRegion.h:
     29        (WebCore::RenderRegion::flowThread):
     30
    1312012-03-20  Luke Macpherson  <macpherson@chromium.org>
    232
  • trunk/Source/WebCore/dom/WebKitNamedFlow.cpp

    r111229 r111376  
    3434#include "NodeList.h"
    3535#include "RenderFlowThread.h"
     36#include "RenderRegion.h"
    3637#include "StaticNodeList.h"
    3738
     
    8687}
    8788
     89PassRefPtr<NodeList> WebKitNamedFlow::getRegionsByContentNode(Node* contentNode)
     90{
     91    if (!contentNode)
     92        return 0;
     93
     94    m_parentFlowThread->document()->updateLayoutIgnorePendingStylesheets();
     95
     96    Vector<RefPtr<Node> > regionNodes;
     97    if (contentNode->renderer()
     98        && contentNode->renderer()->inRenderFlowThread()
     99        && m_parentFlowThread == contentNode->renderer()->enclosingRenderFlowThread()) {
     100        const RenderRegionList& regionList = m_parentFlowThread->renderRegionList();
     101        for (RenderRegionList::const_iterator iter = regionList.begin(); iter != regionList.end(); ++iter) {
     102            const RenderRegion* renderRegion = *iter;
     103            if (!renderRegion->isValid())
     104                continue;
     105            if (m_parentFlowThread->objectInFlowRegion(contentNode->renderer(), renderRegion))
     106                regionNodes.append(renderRegion->node());
     107        }
     108    }
     109    return StaticNodeList::adopt(regionNodes);
     110}
     111
    88112} // namespace WebCore
    89113
  • trunk/Source/WebCore/dom/WebKitNamedFlow.h

    r111229 r111376  
    5252    bool overflow() const;
    5353    PassRefPtr<NodeList> contentNodes() const;
     54    PassRefPtr<NodeList> getRegionsByContentNode(Node*);
    5455
    5556    void registerContentNode(Node* contentNode);
  • trunk/Source/WebCore/dom/WebKitNamedFlow.idl

    r111229 r111376  
    3434        readonly attribute boolean overflow;
    3535        readonly attribute NodeList contentNodes;
     36        NodeList getRegionsByContentNode(in Node contentNode);
    3637    };
    3738}
  • trunk/Source/WebCore/rendering/RenderFlowThread.cpp

    r110731 r111376  
    953953}
    954954
     955bool RenderFlowThread::regionInRange(const RenderRegion* targetRegion, const RenderRegion* startRegion, const RenderRegion* endRegion) const
     956{
     957    ASSERT(targetRegion);
     958
     959    for (RenderRegionList::const_iterator it = m_regionList.find(const_cast<RenderRegion*>(startRegion)); it != m_regionList.end(); ++it) {
     960        const RenderRegion* currRegion = *it;
     961        if (!currRegion->isValid())
     962            continue;
     963        if (targetRegion == currRegion)
     964            return true;
     965        if (currRegion == endRegion)
     966            break;
     967    }
     968
     969    return false;
     970}
     971
     972bool RenderFlowThread::objectInFlowRegion(const RenderObject* object, const RenderRegion* region) const
     973{
     974    ASSERT(object);
     975    ASSERT(region);
     976
     977    if (!object->inRenderFlowThread())
     978        return false;
     979    if (object->enclosingRenderFlowThread() != this)
     980        return false;
     981    if (!m_regionList.contains(const_cast<RenderRegion*>(region)))
     982        return false;
     983
     984    RenderBox* enclosingBox = object->enclosingBox();
     985    RenderRegion* enclosingBoxStartRegion = 0;
     986    RenderRegion* enclosingBoxEndRegion = 0;
     987    getRegionRangeForBox(enclosingBox, enclosingBoxStartRegion, enclosingBoxEndRegion);
     988    if (!regionInRange(region, enclosingBoxStartRegion, enclosingBoxEndRegion))
     989       return false;
     990
     991    if (object->isBox())
     992        return true;
     993
     994    LayoutRect objectABBRect = object->absoluteBoundingBoxRect(true);
     995    if (!objectABBRect.width())
     996        objectABBRect.setWidth(1);
     997    if (!objectABBRect.height())
     998        objectABBRect.setHeight(1);
     999    if (objectABBRect.intersects(region->absoluteBoundingBoxRect(true)))
     1000        return true;
     1001
     1002    if (region == lastRegion()) {
     1003        // If the object does not intersect any of the enclosing box regions
     1004        // then the object is in last region.
     1005        for (RenderRegionList::const_iterator it = m_regionList.find(enclosingBoxStartRegion); it != m_regionList.end(); ++it) {
     1006            const RenderRegion* currRegion = *it;
     1007            if (!region->isValid())
     1008                continue;
     1009            if (currRegion == region)
     1010                break;
     1011            if (objectABBRect.intersects(currRegion->absoluteBoundingBoxRect(true)))
     1012                return false;
     1013        }
     1014        return true;
     1015    }
     1016
     1017    return false;
     1018}
     1019
    9551020} // namespace WebCore
    956 
  • trunk/Source/WebCore/rendering/RenderFlowThread.h

    r110731 r111376  
    138138    bool overflow() const { return m_overflow; }
    139139
     140    // Check if the object is in region and the region is part of this flow thread.
     141    bool objectInFlowRegion(const RenderObject*, const RenderRegion*) const;
     142
    140143private:
    141144    virtual const char* renderName() const { return "RenderFlowThread"; }
     
    148151    bool shouldRepaint(const LayoutRect&) const;
    149152    void regionLayoutUpdateEventTimerFired(Timer<RenderFlowThread>*);
     153    bool regionInRange(const RenderRegion* targetRegion, const RenderRegion* startRegion, const RenderRegion* endRegion) const;
    150154
    151155    typedef ListHashSet<RenderObject*> FlowThreadChildList;
  • trunk/Source/WebCore/rendering/RenderRegion.h

    r110731 r111376  
    5858
    5959    RenderFlowThread* parentFlowThread() const { return m_parentFlowThread; }
     60    RenderFlowThread* flowThread() const { return m_flowThread; }
    6061
    6162    // Valid regions do not create circular dependencies with other flows.
Note: See TracChangeset for help on using the changeset viewer.