Changeset 108970 in webkit


Ignore:
Timestamp:
Feb 27, 2012 1:21:51 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.

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

  • CMakeLists.txt:
  • GNUmakefile.list.am:
  • Target.pri:
  • WebCore.gypi:
  • WebCore.vcproj/WebCore.vcproj:
  • WebCore.xcodeproj/project.pbxproj:
  • dom/Node.cpp:

(WebCore::Node::removeCachedRegionNodeList):
(WebCore):
(WebCore::Node::getRegionsByContentNode):
(WebCore::NodeListsNodeData::invalidateCaches):
(WebCore::NodeListsNodeData::isEmpty):

  • dom/Node.h:

(WebCore):
(Node):

  • dom/NodeRareData.h:

(NodeListsNodeData):

  • dom/RegionNodeList.cpp:

(WebCore):
(WebCore::RegionNodeList::RegionNodeList):
(WebCore::RegionNodeList::~RegionNodeList):
(WebCore::RegionNodeList::nodeMatches):

  • dom/RegionNodeList.h:

(WebCore):
(RegionNodeList):
(WebCore::RegionNodeList::create):

  • dom/WebKitNamedFlow.cpp:

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

  • dom/WebKitNamedFlow.h:

(WebCore):
(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
17 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r108969 r108970  
     12012-02-27  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        * fast/regions/get-regions-by-content-node-expected.txt: Added.
     9        * fast/regions/get-regions-by-content-node-horiz-bt-expected.txt: Added.
     10        * fast/regions/get-regions-by-content-node-horiz-bt.html: Added.
     11        * fast/regions/get-regions-by-content-node-horiz-tb-expected.txt: Added.
     12        * fast/regions/get-regions-by-content-node-horiz-tb.html: Added.
     13        * fast/regions/get-regions-by-content-node-vert-lr-expected.txt: Added.
     14        * fast/regions/get-regions-by-content-node-vert-lr.html: Added.
     15        * fast/regions/get-regions-by-content-node-vert-rl-expected.txt: Added.
     16        * fast/regions/get-regions-by-content-node-vert-rl.html: Added.
     17        * fast/regions/get-regions-by-content-node.html: Added.
     18        * fast/regions/get-regions-by-content-node2-expected.txt: Added.
     19        * fast/regions/get-regions-by-content-node2.html: Added.
     20
    1212012-02-27  Kenichi Ishibashi  <bashi@chromium.org>
    222
  • trunk/Source/WebCore/CMakeLists.txt

    r108959 r108970  
    607607    dom/Range.cpp
    608608    dom/RangeException.cpp
     609    dom/RegionNodeList.cpp
    609610    dom/RegisteredEventListener.cpp
    610611    dom/ScopedEventQueue.cpp
  • trunk/Source/WebCore/ChangeLog

    r108967 r108970  
     12012-02-27  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        Tests: fast/regions/get-regions-by-content-node-horiz-bt.html
     9               fast/regions/get-regions-by-content-node-horiz-tb.html
     10               fast/regions/get-regions-by-content-node-vert-lr.html
     11               fast/regions/get-regions-by-content-node-vert-rl.html
     12               fast/regions/get-regions-by-content-node.html
     13               fast/regions/get-regions-by-content-node2.html
     14
     15        * CMakeLists.txt:
     16        * GNUmakefile.list.am:
     17        * Target.pri:
     18        * WebCore.gypi:
     19        * WebCore.vcproj/WebCore.vcproj:
     20        * WebCore.xcodeproj/project.pbxproj:
     21        * dom/Node.cpp:
     22        (WebCore::Node::removeCachedRegionNodeList):
     23        (WebCore):
     24        (WebCore::Node::getRegionsByContentNode):
     25        (WebCore::NodeListsNodeData::invalidateCaches):
     26        (WebCore::NodeListsNodeData::isEmpty):
     27        * dom/Node.h:
     28        (WebCore):
     29        (Node):
     30        * dom/NodeRareData.h:
     31        (NodeListsNodeData):
     32        * dom/RegionNodeList.cpp:
     33        (WebCore):
     34        (WebCore::RegionNodeList::RegionNodeList):
     35        (WebCore::RegionNodeList::~RegionNodeList):
     36        (WebCore::RegionNodeList::nodeMatches):
     37        * dom/RegionNodeList.h:
     38        (WebCore):
     39        (RegionNodeList):
     40        (WebCore::RegionNodeList::create):
     41        * dom/WebKitNamedFlow.cpp:
     42        (WebCore::WebKitNamedFlow::getRegionsByContentNode):
     43        (WebCore):
     44        * dom/WebKitNamedFlow.h:
     45        (WebCore):
     46        (WebKitNamedFlow):
     47        * dom/WebKitNamedFlow.idl:
     48        * rendering/RenderFlowThread.cpp:
     49        (WebCore::RenderFlowThread::regionInRange):
     50        (WebCore):
     51        (WebCore::RenderFlowThread::objectInFlowRegion):
     52        * rendering/RenderFlowThread.h:
     53        * rendering/RenderRegion.h:
     54        (WebCore::RenderRegion::flowThread):
     55
    1562012-02-27  Yury Semikhatsky  <yurys@chromium.org>
    257
  • trunk/Source/WebCore/GNUmakefile.list.am

    r108959 r108970  
    17201720        Source/WebCore/dom/Range.h \
    17211721        Source/WebCore/dom/RawDataDocumentParser.h \
     1722        Source/WebCore/dom/RegionNodeList.cpp \
     1723        Source/WebCore/dom/RegionNodeList.h \
    17221724        Source/WebCore/dom/RegisteredEventListener.cpp \
    17231725        Source/WebCore/dom/RegisteredEventListener.h \
  • trunk/Source/WebCore/Target.pri

    r108959 r108970  
    562562    dom/RangeException.cpp \
    563563    dom/RawDataDocumentParser.h \
     564    dom/RegionNodeList.cpp \
    564565    dom/RegisteredEventListener.cpp \
    565566    dom/ScopedEventQueue.cpp \
  • trunk/Source/WebCore/WebCore.gypi

    r108959 r108970  
    51325132            'dom/RangeException.cpp',
    51335133            'dom/RangeException.h',
     5134            'dom/RegionNodeList.cpp',
     5135            'dom/RegionNodeList.h',
    51345136            'dom/RawDataDocumentParser.h',
    51355137            'dom/RegisteredEventListener.cpp',
  • trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj

    r108958 r108970  
    5085150851                        </File>
    5085250852                        <File
     50853                                RelativePath="..\dom\RegionNodeList.cpp"
     50854                                >
     50855                        </File>
     50856                        <File
     50857                                RelativePath="..\dom\RegionNodeList.h"
     50858                                >
     50859                        </File>
     50860                        <File
    5085350861                                RelativePath="..\dom\RegisteredEventListener.cpp"
    5085450862                                >
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r108959 r108970  
    30123012                8AA61D00144D595B00F37350 /* WebKitCSSRegionRule.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AA61CFE144D595B00F37350 /* WebKitCSSRegionRule.h */; };
    30133013                8AB4BC77126FDB7100DEB727 /* IgnoreDestructiveWriteCountIncrementer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AB4BC76126FDB7100DEB727 /* IgnoreDestructiveWriteCountIncrementer.h */; };
     3014                8ABAFB9F14F5107500A4984B /* RegionNodeList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8ABAFB9D14F5107500A4984B /* RegionNodeList.cpp */; };
     3015                8ABAFBA014F5107500A4984B /* RegionNodeList.h in Headers */ = {isa = PBXBuildFile; fileRef = 8ABAFB9E14F5107500A4984B /* RegionNodeList.h */; };
    30143016                8AD0A59414C88336000D83C5 /* JSWebKitCSSRegionRule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8ACC24CD148E24B200EFCC0D /* JSWebKitCSSRegionRule.cpp */; };
    30153017                8AD0A59514C88336000D83C5 /* JSWebKitCSSRegionRule.h in Headers */ = {isa = PBXBuildFile; fileRef = 8ACC24CE148E24B200EFCC0D /* JSWebKitCSSRegionRule.h */; };
     
    98819883                8AA61CFE144D595B00F37350 /* WebKitCSSRegionRule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebKitCSSRegionRule.h; sourceTree = "<group>"; };
    98829884                8AB4BC76126FDB7100DEB727 /* IgnoreDestructiveWriteCountIncrementer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IgnoreDestructiveWriteCountIncrementer.h; sourceTree = "<group>"; };
     9885                8ABAFB9D14F5107500A4984B /* RegionNodeList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegionNodeList.cpp; sourceTree = "<group>"; };
     9886                8ABAFB9E14F5107500A4984B /* RegionNodeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegionNodeList.h; sourceTree = "<group>"; };
    98839887                8ACC24CD148E24B200EFCC0D /* JSWebKitCSSRegionRule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWebKitCSSRegionRule.cpp; sourceTree = "<group>"; };
    98849888                8ACC24CE148E24B200EFCC0D /* JSWebKitCSSRegionRule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWebKitCSSRegionRule.h; sourceTree = "<group>"; };
     
    2083720841                                D23CA5480AB0E983005108A5 /* RangeException.idl */,
    2083820842                                A84D827B11D333ED00972990 /* RawDataDocumentParser.h */,
     20843                                8ABAFB9D14F5107500A4984B /* RegionNodeList.cpp */,
     20844                                8ABAFB9E14F5107500A4984B /* RegionNodeList.h */,
    2083920845                                85031B350A44EFC700F992E0 /* RegisteredEventListener.cpp */,
    2084020846                                85031B360A44EFC700F992E0 /* RegisteredEventListener.h */,
     
    2436724373                                977E2E0F12F0FC9C00C13379 /* XSSAuditor.h in Headers */,
    2436824374                                FD537353137B651800008DCE /* ZeroPole.h in Headers */,
     24375                                8ABAFBA014F5107500A4984B /* RegionNodeList.h in Headers */,
    2436924376                        );
    2437024377                        runOnlyForDeploymentPostprocessing = 0;
     
    2731927326                                977E2E0E12F0FC9C00C13379 /* XSSAuditor.cpp in Sources */,
    2732027327                                FD537352137B651800008DCE /* ZeroPole.cpp in Sources */,
     27328                                8ABAFB9F14F5107500A4984B /* RegionNodeList.cpp in Sources */,
    2732127329                        );
    2732227330                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/Source/WebCore/dom/Node.cpp

    r108959 r108970  
    10321032}
    10331033
     1034void Node::removeCachedRegionNodeList(RegionNodeList* list, const AtomicString& flowName)
     1035{
     1036    ASSERT(rareData());
     1037    ASSERT(rareData()->nodeLists());
     1038
     1039    NodeListsNodeData* data = rareData()->nodeLists();
     1040    ASSERT_UNUSED(list, list == data->m_regionNodeListCache.get(flowName));
     1041    data->m_regionNodeListCache.remove(flowName);
     1042}
     1043
    10341044void Node::removeCachedNameNodeList(NameNodeList* list, const String& nodeName)
    10351045{
     
    16641674
    16651675    RefPtr<ClassNodeList> list = ClassNodeList::create(this, classNames);
     1676    result.first->second = list.get();
     1677    return list.release();
     1678}
     1679
     1680PassRefPtr<NodeList> Node::getRegionsByContentNode(const AtomicString& flowName)
     1681{
     1682    pair<NodeListsNodeData::RegionNodeListCache::iterator, bool> result
     1683    = ensureRareData()->ensureNodeLists(this)->m_regionNodeListCache.add(flowName, 0);
     1684    if (!result.second)
     1685        return PassRefPtr<NodeList>(result.first->second);
     1686   
     1687    RefPtr<RegionNodeList> list = RegionNodeList::create(this, flowName);
    16661688    result.first->second = list.get();
    16671689    return list.release();
     
    23532375    for (TagNodeListCacheNS::const_iterator it = m_tagNodeListCacheNS.begin(); it != tagCacheNSEnd; ++it)
    23542376        it->second->invalidateCache();
     2377    RegionNodeListCache::const_iterator regionListCacheEnd = m_regionNodeListCache.end();
     2378    for (RegionNodeListCache::const_iterator it = m_regionNodeListCache.begin(); it != regionListCacheEnd; ++it)
     2379        it->second->invalidateCache();
    23552380    invalidateCachesThatDependOnAttributes();
    23562381}
     
    23992424        return false;
    24002425#endif
     2426    if (!m_regionNodeListCache.isEmpty())
     2427        return false;
    24012428
    24022429    if (m_labelsNodeListCache)
    24032430        return false;
    2404 
     2431   
    24052432    return true;
    24062433}
  • trunk/Source/WebCore/dom/Node.h

    r108809 r108970  
    7373class PlatformWheelEvent;
    7474class QualifiedName;
     75class RegionNodeList;
    7576class RegisteredEventListener;
    7677class RenderArena;
     
    551552    void invalidateNodeListsCacheAfterAttributeChanged(const QualifiedName&);
    552553    void invalidateNodeListsCacheAfterChildrenChanged();
     554    void invalidateRegionListCache();
    553555    void notifyLocalNodeListsLabelChanged();
    554556    void removeCachedClassNodeList(ClassNodeList*, const String&);
     
    558560    void removeCachedTagNodeList(TagNodeList*, const QualifiedName&);
    559561    void removeCachedLabelsNodeList(DynamicSubtreeNodeList*);
     562    void removeCachedRegionNodeList(RegionNodeList*, const AtomicString&);
    560563
    561564    void removeCachedChildNodeList();
     
    565568    PassRefPtr<NodeList> getElementsByName(const String& elementName);
    566569    PassRefPtr<NodeList> getElementsByClassName(const String& classNames);
     570    PassRefPtr<NodeList> getRegionsByContentNode(const AtomicString& flowName);
    567571
    568572    PassRefPtr<Element> querySelector(const String& selectors, ExceptionCode&);
  • trunk/Source/WebCore/dom/NodeRareData.h

    r107793 r108970  
    3030#include "NameNodeList.h"
    3131#include "QualifiedName.h"
     32#include "RegionNodeList.h"
    3233#include "TagNodeList.h"
    3334#include "WebKitMutationObserver.h"
     
    7273
    7374    LabelsNodeList* m_labelsNodeListCache;
     75
     76    typedef HashMap<AtomicString, RegionNodeList*> RegionNodeListCache;
     77    RegionNodeListCache m_regionNodeListCache;
    7478 
    7579    static PassOwnPtr<NodeListsNodeData> create()
  • trunk/Source/WebCore/dom/RegionNodeList.cpp

    r108969 r108970  
    11/*
    2  * Copyright (C) 2011 Adobe Systems Incorporated. All rights reserved.
     2 * Copyright 2012 Adobe Systems Incorporated. All Rights Reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2929
    3030#include "config.h"
     31#include "RegionNodeList.h"
     32
     33#include "Document.h"
     34#include "RenderFlowThread.h"
     35#include "RenderRegion.h"
    3136#include "WebKitNamedFlow.h"
    32 
    33 #include "RenderFlowThread.h"
    3437
    3538namespace WebCore {
    3639
    37 WebKitNamedFlow::WebKitNamedFlow(RenderFlowThread* parentFlowThread)
    38 : m_parentFlowThread(parentFlowThread)
     40RegionNodeList::RegionNodeList(PassRefPtr<Node> node, const AtomicString& flowName)
     41: DynamicSubtreeNodeList(node->document())
     42, m_contentNode(node)
     43, m_flowName(flowName)
    3944{
    4045}
    4146
    42 WebKitNamedFlow::~WebKitNamedFlow()
     47RegionNodeList::~RegionNodeList()
    4348{
    44 }
     49    m_contentNode->removeCachedRegionNodeList(this, m_flowName);
     50}
    4551
    46 bool WebKitNamedFlow::overflow() const
     52bool RegionNodeList::nodeMatches(Element* testNode) const
    4753{
    48     m_parentFlowThread->document()->updateLayoutIgnorePendingStylesheets();
    49     return m_parentFlowThread->overflow();
     54    if (!m_contentNode->renderer())
     55        return false;
     56
     57    if (!testNode->renderer() || !testNode->renderer()->isRenderRegion())
     58        return false;
     59
     60    RenderRegion* region = toRenderRegion(testNode->renderer());
     61    if (!region->isValid() || (region->style()->regionThread() != m_flowName))
     62        return false;
     63
     64    return region->flowThread()->objectInFlowRegion(m_contentNode->renderer(), region);
    5065}
    5166
    5267} // namespace WebCore
     68
  • trunk/Source/WebCore/dom/RegionNodeList.h

    r108969 r108970  
    11/*
    2  * Copyright (C) 2011 Adobe Systems Incorporated. All rights reserved.
     2 * Copyright 2012 Adobe Systems Incorporated. All Rights Reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2828 */
    2929
    30 #ifndef WebKitNamedFlow_h
    31 #define WebKitNamedFlow_h
     30#ifndef RegionNodeList_h
     31#define RegionNodeList_h
    3232
    33 #include <wtf/RefCounted.h>
    34 #include <wtf/RefPtr.h>
     33#include "DynamicNodeList.h"
     34#include "Node.h"
    3535
    3636namespace WebCore {
    3737
    38 class RenderFlowThread;
     38class RegionNodeList : public DynamicSubtreeNodeList {
     39public:
     40    static PassRefPtr<RegionNodeList> create(PassRefPtr<Node> node, const AtomicString& flowName)
     41    {
     42        return adoptRef(new RegionNodeList(node, flowName));
     43    }
     44   
     45    virtual ~RegionNodeList();
    3946
    40 class WebKitNamedFlow : public RefCounted<WebKitNamedFlow> {
    41 public:
    42     static PassRefPtr<WebKitNamedFlow> create(RenderFlowThread* parentFlowThread)
    43     {
    44         return adoptRef(new WebKitNamedFlow(parentFlowThread));
    45     }
     47protected:
     48    virtual bool nodeMatches(Element*) const;
    4649
    47     ~WebKitNamedFlow();
    48 
    49     bool overflow() const;
    5050private:
    51     WebKitNamedFlow(RenderFlowThread*);
    52 
    53     RenderFlowThread* m_parentFlowThread;
     51    RegionNodeList(PassRefPtr<Node>, const AtomicString& flowName);
     52   
     53    RefPtr<Node> m_contentNode;
     54    AtomicString m_flowName;
    5455};
    55 
    56 }
     56   
     57} // namespace WebCore
    5758
    5859#endif
     60
  • trunk/Source/WebCore/dom/WebKitNamedFlow.cpp

    r108952 r108970  
    3131#include "WebKitNamedFlow.h"
    3232
     33#include "Node.h"
     34#include "NodeList.h"
    3335#include "RenderFlowThread.h"
    3436
     
    5052}
    5153
     54PassRefPtr<NodeList> WebKitNamedFlow::getRegionsByContentNode(Node* contentNode)
     55{
     56    if (!contentNode)
     57        return 0;
     58    m_parentFlowThread->document()->updateLayoutIgnorePendingStylesheets();
     59    return contentNode->getRegionsByContentNode(m_parentFlowThread->flowThread());
     60}
     61
    5262} // namespace WebCore
     63
  • trunk/Source/WebCore/dom/WebKitNamedFlow.h

    r108952 r108970  
    3636namespace WebCore {
    3737
     38class Node;
     39class NodeList;
    3840class RenderFlowThread;
    3941
     
    4850
    4951    bool overflow() const;
     52    PassRefPtr<NodeList> getRegionsByContentNode(Node*);
     53
    5054private:
    5155    WebKitNamedFlow(RenderFlowThread*);
  • trunk/Source/WebCore/dom/WebKitNamedFlow.idl

    r108952 r108970  
    3333    ] WebKitNamedFlow {
    3434        readonly attribute boolean overflow;
     35        NodeList getRegionsByContentNode(in Node contentNode);
    3536    };
    3637}
     38
  • trunk/Source/WebCore/rendering/RenderFlowThread.cpp

    r108952 r108970  
    1414 *    provided with the distribution.
    1515 *
    16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
     16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY
    1717 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    1818 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     
    906906}
    907907
     908bool RenderFlowThread::regionInRange(const RenderRegion* targetRegion, const RenderRegion* startRegion, const RenderRegion* endRegion) const
     909{
     910    ASSERT(targetRegion);
     911
     912    for (RenderRegionList::const_iterator it = m_regionList.find(const_cast<RenderRegion*>(startRegion)); it != m_regionList.end(); ++it) {
     913        const RenderRegion* currRegion = *it;
     914        if (!currRegion->isValid())
     915            continue;
     916        if (targetRegion == currRegion)
     917            return true;
     918        if (currRegion == endRegion)
     919            break;
     920    }
     921
     922    return false;
     923}
     924
     925bool RenderFlowThread::objectInFlowRegion(const RenderObject* object, const RenderRegion* region) const
     926{
     927    ASSERT(object);
     928    ASSERT(region);
     929
     930    if (!object->inRenderFlowThread())
     931        return false;
     932    if (object->enclosingRenderFlowThread() != this)
     933        return false;
     934    if (!m_regionList.contains(const_cast<RenderRegion*>(region)))
     935        return false;
     936
     937    RenderBox* enclosingBox = object->enclosingBox();
     938    RenderRegion* enclosingBoxStartRegion = 0;
     939    RenderRegion* enclosingBoxEndRegion = 0;
     940    getRegionRangeForBox(enclosingBox, enclosingBoxStartRegion, enclosingBoxEndRegion);
     941    if (!regionInRange(region, enclosingBoxStartRegion, enclosingBoxEndRegion))
     942        return false;
     943
     944    if (object->isBox())
     945        return true;
     946
     947    LayoutRect objectABBRect = object->absoluteBoundingBoxRect(true);
     948    if (!objectABBRect.width())
     949        objectABBRect.setWidth(1);
     950    if (!objectABBRect.height())
     951        objectABBRect.setHeight(1);
     952    if (objectABBRect.intersects(region->absoluteBoundingBoxRect(true)))
     953        return true;
     954
     955    if (region == lastRegion()) {
     956        // If the object does not intersect any of the enclosing box regions
     957        // then the object is in last region.
     958        for (RenderRegionList::const_iterator it = m_regionList.find(enclosingBoxStartRegion); it != m_regionList.end(); ++it) {
     959            const RenderRegion* currRegion = *it;
     960            if (!region->isValid())
     961                continue;
     962            if (currRegion == region)
     963                break;
     964            if (objectABBRect.intersects(currRegion->absoluteBoundingBoxRect(true)))
     965                return false;
     966        }
     967        return true;
     968    }
     969
     970    return false;
     971}
     972
    908973} // namespace WebCore
     974
  • trunk/Source/WebCore/rendering/RenderFlowThread.h

    r108952 r108970  
    1414 *    provided with the distribution.
    1515 *
    16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
     16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY
    1717 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    1818 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     
    137137
    138138    bool overflow() const { return m_overflow; }
     139
     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
    139143private:
    140144    virtual const char* renderName() const { return "RenderFlowThread"; }
     
    146150
    147151    bool shouldRepaint(const LayoutRect&) const;
     152
     153    bool regionInRange(const RenderRegion* targetRegion, const RenderRegion* startRegion, const RenderRegion* endRegion) const;
    148154
    149155    typedef ListHashSet<RenderObject*> FlowThreadChildList;
  • trunk/Source/WebCore/rendering/RenderRegion.h

    r108952 r108970  
    5757    void detachRegion();
    5858
     59    RenderFlowThread* flowThread() const { return m_flowThread; }
    5960    RenderFlowThread* parentFlowThread() const { return m_parentFlowThread; }
    6061
Note: See TracChangeset for help on using the changeset viewer.