Changeset 114189 in webkit


Ignore:
Timestamp:
Apr 13, 2012 5:36:10 PM (12 years ago)
Author:
mihnea@adobe.com
Message:

[CSSRegions]Implement NamedFlow::contentNodes attribute
https://bugs.webkit.org/show_bug.cgi?id=80134

Reviewed by David Hyatt.

Source/WebCore:

The named flow content nodes collection contains those nodes with webkitFlowInto property set to 'flow'.
In the list, the nodes are placed in document order. Nodes with display:none are also part of the list.
The list of nodes is returned as a static node list.

The content nodes are stored in RenderNamedFlowThread. The content nodes are added to the list in NodeRenderingContext::moveToFlowThreadIfNeeded
and removed from the list in Element::detach. When an element -webkit-flow-into property is changed, the element is detached and attached.
I have also added a bit in NodeFlags to mark that an element is part of a named flow (and the corresponding inNamedFlow/setInNamedFlow/clearInNamedFlow functions).

Test: fast/regions/webkit-named-flow-content-nodes.html

  • dom/Document.cpp:

(WebCore::Document::webkitGetFlowByName):

  • dom/Document.h:
  • dom/Element.cpp:

(WebCore::Element::detach):

  • dom/Node.h:

(WebCore::Node::inNamedFlow):
(WebCore::Node::setInNamedFlow):
(WebCore::Node::clearInNamedFlow):
(Node):

  • dom/NodeRenderingContext.cpp:

(WebCore::NodeRenderingContext::moveToFlowThreadIfNeeded):

  • dom/WebKitNamedFlow.cpp:

(WebCore::WebKitNamedFlow::contentNodes):
(WebCore):

  • dom/WebKitNamedFlow.h:

(WebKitNamedFlow):

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

(WebCore::FlowThreadController::registerNamedFlowContentNode):
(WebCore):
(WebCore::FlowThreadController::unregisterNamedFlowContentNode):

  • rendering/FlowThreadController.h:

(FlowThreadController):

  • rendering/RenderNamedFlowThread.cpp:

(WebCore):
(WebCore::RenderNamedFlowThread::registerNamedFlowContentNode):
(WebCore::RenderNamedFlowThread::unregisterNamedFlowContentNode):

  • rendering/RenderNamedFlowThread.h:

(WebCore):
(RenderNamedFlowThread):
(WebCore::RenderNamedFlowThread::contentNodes):
(WebCore::RenderNamedFlowThread::hasContentNode):

LayoutTests:

  • fast/regions/webkit-named-flow-content-nodes-expected.txt: Added.
  • fast/regions/webkit-named-flow-content-nodes.html: Added.
Location:
trunk
Files:
2 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r114182 r114189  
     12012-04-13  Mihnea Ovidenie  <mihnea@adobe.com>
     2
     3        [CSSRegions]Implement NamedFlow::contentNodes attribute
     4        https://bugs.webkit.org/show_bug.cgi?id=80134
     5
     6        Reviewed by David Hyatt.
     7
     8        * fast/regions/webkit-named-flow-content-nodes-expected.txt: Added.
     9        * fast/regions/webkit-named-flow-content-nodes.html: Added.
     10
    1112012-04-13  Simon Fraser  <simon.fraser@apple.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r114188 r114189  
     12012-04-13  Mihnea Ovidenie  <mihnea@adobe.com>
     2
     3        [CSSRegions]Implement NamedFlow::contentNodes attribute
     4        https://bugs.webkit.org/show_bug.cgi?id=80134
     5
     6        Reviewed by David Hyatt.
     7
     8        The named flow content nodes collection contains those nodes with webkitFlowInto property set to 'flow'.
     9        In the list, the nodes are placed in document order. Nodes with display:none are also part of the list.
     10        The list of nodes is returned as a static node list.
     11
     12        The content nodes are stored in RenderNamedFlowThread. The content nodes are added to the list in NodeRenderingContext::moveToFlowThreadIfNeeded
     13        and removed from the list in Element::detach. When an element -webkit-flow-into property is changed, the element is detached and attached.
     14        I have also added a bit in NodeFlags to mark that an element is part of a named flow (and the corresponding inNamedFlow/setInNamedFlow/clearInNamedFlow functions).
     15
     16        Test: fast/regions/webkit-named-flow-content-nodes.html
     17
     18        * dom/Document.cpp:
     19        (WebCore::Document::webkitGetFlowByName):
     20        * dom/Document.h:
     21        * dom/Element.cpp:
     22        (WebCore::Element::detach):
     23        * dom/Node.h:
     24        (WebCore::Node::inNamedFlow):
     25        (WebCore::Node::setInNamedFlow):
     26        (WebCore::Node::clearInNamedFlow):
     27        (Node):
     28        * dom/NodeRenderingContext.cpp:
     29        (WebCore::NodeRenderingContext::moveToFlowThreadIfNeeded):
     30        * dom/WebKitNamedFlow.cpp:
     31        (WebCore::WebKitNamedFlow::contentNodes):
     32        (WebCore):
     33        * dom/WebKitNamedFlow.h:
     34        (WebKitNamedFlow):
     35        * dom/WebKitNamedFlow.idl:
     36        * rendering/FlowThreadController.cpp:
     37        (WebCore::FlowThreadController::registerNamedFlowContentNode):
     38        (WebCore):
     39        (WebCore::FlowThreadController::unregisterNamedFlowContentNode):
     40        * rendering/FlowThreadController.h:
     41        (FlowThreadController):
     42        * rendering/RenderNamedFlowThread.cpp:
     43        (WebCore):
     44        (WebCore::RenderNamedFlowThread::registerNamedFlowContentNode):
     45        (WebCore::RenderNamedFlowThread::unregisterNamedFlowContentNode):
     46        * rendering/RenderNamedFlowThread.h:
     47        (WebCore):
     48        (RenderNamedFlowThread):
     49        (WebCore::RenderNamedFlowThread::contentNodes):
     50        (WebCore::RenderNamedFlowThread::hasContentNode):
     51
    1522012-04-13  Jessie Berlin  <jberlin@apple.com>
    253
  • trunk/Source/WebCore/dom/Document.cpp

    r114168 r114189  
    10751075PassRefPtr<WebKitNamedFlow> Document::webkitGetFlowByName(const String& flowName)
    10761076{
    1077     if (!cssRegionsEnabled() || flowName.isEmpty() || !validFlowName(flowName) || !renderer())
     1077    return webkitGetFlowByName(flowName, CheckFlowNameForInvalidValues);
     1078}
     1079
     1080PassRefPtr<WebKitNamedFlow> Document::webkitGetFlowByName(const String& flowName, FlowNameCheck flowNameCheck)
     1081{
     1082    if (!cssRegionsEnabled() || !renderer())
    10781083        return 0;
    10791084
    1080     // Make a slower check for invalid flow name
    1081     CSSParser parser(CSSStrictMode);
    1082     if (!parser.parseFlowThread(flowName, this))
    1083         return 0;
     1085    if (flowNameCheck == CheckFlowNameForInvalidValues) {
     1086        if (flowName.isEmpty() || !validFlowName(flowName))
     1087            return 0;
     1088
     1089        // Make a slower check for invalid flow name.
     1090        CSSParser parser(CSSStrictMode);
     1091        if (!parser.parseFlowThread(flowName, this))
     1092            return 0;
     1093    }
    10841094
    10851095    if (RenderView* view = renderer()->view())
  • trunk/Source/WebCore/dom/Document.h

    r114168 r114189  
    353353
    354354    bool cssRegionsEnabled() const;
     355    enum FlowNameCheck {
     356        CheckFlowNameForInvalidValues,
     357        DoNotCheckFlowNameForInvalidValues
     358    };
    355359    PassRefPtr<WebKitNamedFlow> webkitGetFlowByName(const String&);
     360    PassRefPtr<WebKitNamedFlow> webkitGetFlowByName(const String&, FlowNameCheck);
    356361
    357362    bool regionBasedColumnsEnabled() const;
  • trunk/Source/WebCore/dom/Element.cpp

    r113990 r114189  
    4141#include "ElementRareData.h"
    4242#include "ExceptionCode.h"
     43#include "FlowThreadController.h"
    4344#include "FocusController.h"
    4445#include "Frame.h"
     
    983984    RenderWidget::suspendWidgetHierarchyUpdates();
    984985
     986    if (document()->cssRegionsEnabled() && inNamedFlow()) {
     987        if (document()->renderer() && document()->renderer()->view())
     988            document()->renderer()->view()->flowThreadController()->unregisterNamedFlowContentNode(this);
     989    }
     990
    985991    cancelFocusAppearanceUpdate();
    986992    if (hasRareData())
  • trunk/Source/WebCore/dom/Node.h

    r113897 r114189  
    216216    bool isDocumentNode() const;
    217217    bool isShadowRoot() const { return getFlag(IsShadowRootFlag); }
     218    bool inNamedFlow() const { return getFlag(InNamedFlowFlag); }
    218219
    219220    Node* shadowAncestorNode() const;
     
    324325    void setIsLink() { setFlag(IsLinkFlag); }
    325326    void clearIsLink() { clearFlag(IsLinkFlag); }
     327
     328    void setInNamedFlow() { setFlag(InNamedFlowFlag); }
     329    void clearInNamedFlow() { clearFlag(InNamedFlowFlag); }
    326330
    327331    enum ShouldSetAttached {
     
    666670
    667671#if ENABLE(SVG)
    668         DefaultNodeFlags = IsParsingChildrenFinishedFlag | IsStyleAttributeValidFlag | AreSVGAttributesValidFlag
     672        DefaultNodeFlags = IsParsingChildrenFinishedFlag | IsStyleAttributeValidFlag | AreSVGAttributesValidFlag,
    669673#else
    670         DefaultNodeFlags = IsParsingChildrenFinishedFlag | IsStyleAttributeValidFlag
    671 #endif
     674        DefaultNodeFlags = IsParsingChildrenFinishedFlag | IsStyleAttributeValidFlag,
     675#endif
     676        InNamedFlowFlag = 1 << 29
    672677    };
    673678
  • trunk/Source/WebCore/dom/NodeRenderingContext.cpp

    r113842 r114189  
    328328    m_flowThread = m_style->flowThread();
    329329    ASSERT(m_node->document()->renderView());
    330     m_parentFlowRenderer = m_node->document()->renderView()->flowThreadController()->ensureRenderFlowThreadWithName(m_flowThread);
     330    FlowThreadController* flowThreadController = m_node->document()->renderView()->flowThreadController();
     331    m_parentFlowRenderer = flowThreadController->ensureRenderFlowThreadWithName(m_flowThread);
     332    flowThreadController->registerNamedFlowContentNode(m_node, m_parentFlowRenderer);
    331333}
    332334
  • trunk/Source/WebCore/dom/WebKitNamedFlow.cpp

    r112453 r114189  
    7575}
    7676
     77PassRefPtr<NodeList> WebKitNamedFlow::contentNodes() const
     78{
     79    m_parentFlowThread->document()->updateLayoutIgnorePendingStylesheets();
     80
     81    Vector<RefPtr<Node> > contentNodes;
     82    for (NamedFlowContentNodes::const_iterator it = m_parentFlowThread->contentNodes().begin(); it != m_parentFlowThread->contentNodes().end(); ++it) {
     83        Node* node = const_cast<Node*>(*it);
     84        ASSERT(node->computedStyle()->flowThread() == m_parentFlowThread->flowThreadName());
     85        contentNodes.append(node);
     86    }
     87
     88    return StaticNodeList::adopt(contentNodes);
     89}
     90
    7791} // namespace WebCore
    7892
  • trunk/Source/WebCore/dom/WebKitNamedFlow.h

    r112453 r114189  
    3131#define WebKitNamedFlow_h
    3232
     33#include <Node.h>
     34#include <wtf/ListHashSet.h>
    3335#include <wtf/RefCounted.h>
    3436#include <wtf/RefPtr.h>
     
    3638namespace WebCore {
    3739
    38 class Node;
    3940class NodeList;
    4041class RenderNamedFlowThread;
     
    5152    bool overflow() const;
    5253    PassRefPtr<NodeList> getRegionsByContentNode(Node*);
     54    PassRefPtr<NodeList> contentNodes() const;
    5355
    5456private:
  • trunk/Source/WebCore/dom/WebKitNamedFlow.idl

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

    r113842 r114189  
    102102}
    103103
     104void FlowThreadController::registerNamedFlowContentNode(Node* contentNode, RenderNamedFlowThread* namedFlow)
     105{
     106    ASSERT(contentNode && contentNode->isElementNode());
     107    ASSERT(namedFlow);
     108    ASSERT(!m_mapNamedFlowContentNodes.contains(contentNode));
     109    ASSERT(!namedFlow->hasContentNode(contentNode));
     110    m_mapNamedFlowContentNodes.add(contentNode, namedFlow);
     111    namedFlow->registerNamedFlowContentNode(contentNode);
     112}
     113
     114void FlowThreadController::unregisterNamedFlowContentNode(Node* contentNode)
     115{
     116    ASSERT(contentNode && contentNode->isElementNode());
     117    HashMap<Node*, RenderNamedFlowThread*>::iterator it = m_mapNamedFlowContentNodes.find(contentNode);
     118    ASSERT(it != m_mapNamedFlowContentNodes.end());
     119    ASSERT(it->second);
     120    ASSERT(it->second->hasContentNode(contentNode));
     121    it->second->unregisterNamedFlowContentNode(contentNode);
     122    m_mapNamedFlowContentNodes.remove(contentNode);
     123}
     124
    104125} // namespace WebCore
  • trunk/Source/WebCore/rendering/FlowThreadController.h

    r113842 r114189  
    6363    void layoutRenderNamedFlowThreads();
    6464
     65    void registerNamedFlowContentNode(Node*, RenderNamedFlowThread*);
     66    void unregisterNamedFlowContentNode(Node*);
     67
    6568protected:
    6669    FlowThreadController(RenderView*);
     
    7174    bool m_isRenderNamedFlowThreadOrderDirty;
    7275    OwnPtr<RenderNamedFlowThreadList> m_renderNamedFlowThreadList;
     76    // maps a content node to its render flow thread.
     77    HashMap<Node*, RenderNamedFlowThread*> m_mapNamedFlowContentNodes;
    7378};
    7479
  • trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp

    r113842 r114189  
    254254}
    255255
    256 }
     256// The content nodes list contains those nodes with -webkit-flow-into: flow.
     257// An element with display:none should also be listed among those nodes.
     258// The list of nodes is ordered.
     259void RenderNamedFlowThread::registerNamedFlowContentNode(Node* contentNode)
     260{
     261    ASSERT(contentNode && contentNode->isElementNode());
     262
     263    contentNode->setInNamedFlow();
     264
     265    // Find the first content node following the new content node.
     266    for (NamedFlowContentNodes::iterator it = m_contentNodes.begin(); it != m_contentNodes.end(); ++it) {
     267        Node* node = *it;
     268        unsigned short position = contentNode->compareDocumentPosition(node);
     269        if (position & Node::DOCUMENT_POSITION_FOLLOWING) {
     270            m_contentNodes.insertBefore(node, contentNode);
     271            return;
     272        }
     273    }
     274    m_contentNodes.add(contentNode);
     275}
     276
     277void RenderNamedFlowThread::unregisterNamedFlowContentNode(Node* contentNode)
     278{
     279    ASSERT(contentNode && contentNode->isElementNode());
     280    ASSERT(m_contentNodes.contains(contentNode));
     281    ASSERT(contentNode->inNamedFlow());
     282
     283    contentNode->clearInNamedFlow();
     284    m_contentNodes.remove(contentNode);
     285
     286}
     287
     288}
  • trunk/Source/WebCore/rendering/RenderNamedFlowThread.h

    r113842 r114189  
    3535namespace WebCore {
    3636
     37class Node;
    3738class RenderNamedFlowThread;
    3839class WebKitNamedFlow;
     
    4041typedef ListHashSet<RenderNamedFlowThread*> RenderNamedFlowThreadList;
    4142typedef HashCountedSet<RenderNamedFlowThread*> RenderNamedFlowThreadCountedSet;
     43typedef ListHashSet<Node*> NamedFlowContentNodes;
    4244
    4345class RenderNamedFlowThread : public RenderFlowThread {
     
    6365
    6466    WebKitNamedFlow* ensureNamedFlow();
     67    void registerNamedFlowContentNode(Node*);
     68    void unregisterNamedFlowContentNode(Node*);
     69    const NamedFlowContentNodes& contentNodes() const { return m_contentNodes; }
     70    bool hasContentNode(Node* contentNode) const { ASSERT(contentNode); return m_contentNodes.contains(contentNode); }
    6571
    6672private:
     
    9197    FlowThreadChildList m_flowThreadChildList;
    9298
     99    NamedFlowContentNodes m_contentNodes;
     100
    93101    // The DOM Object that represents a named flow.
    94102    RefPtr<WebKitNamedFlow> m_namedFlow;
Note: See TracChangeset for help on using the changeset viewer.