Changeset 114189 in webkit
- Timestamp:
- Apr 13, 2012 5:36:10 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r114182 r114189 1 2012-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 1 11 2012-04-13 Simon Fraser <simon.fraser@apple.com> 2 12 -
trunk/Source/WebCore/ChangeLog
r114188 r114189 1 2012-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 1 52 2012-04-13 Jessie Berlin <jberlin@apple.com> 2 53 -
trunk/Source/WebCore/dom/Document.cpp
r114168 r114189 1075 1075 PassRefPtr<WebKitNamedFlow> Document::webkitGetFlowByName(const String& flowName) 1076 1076 { 1077 if (!cssRegionsEnabled() || flowName.isEmpty() || !validFlowName(flowName) || !renderer()) 1077 return webkitGetFlowByName(flowName, CheckFlowNameForInvalidValues); 1078 } 1079 1080 PassRefPtr<WebKitNamedFlow> Document::webkitGetFlowByName(const String& flowName, FlowNameCheck flowNameCheck) 1081 { 1082 if (!cssRegionsEnabled() || !renderer()) 1078 1083 return 0; 1079 1084 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 } 1084 1094 1085 1095 if (RenderView* view = renderer()->view()) -
trunk/Source/WebCore/dom/Document.h
r114168 r114189 353 353 354 354 bool cssRegionsEnabled() const; 355 enum FlowNameCheck { 356 CheckFlowNameForInvalidValues, 357 DoNotCheckFlowNameForInvalidValues 358 }; 355 359 PassRefPtr<WebKitNamedFlow> webkitGetFlowByName(const String&); 360 PassRefPtr<WebKitNamedFlow> webkitGetFlowByName(const String&, FlowNameCheck); 356 361 357 362 bool regionBasedColumnsEnabled() const; -
trunk/Source/WebCore/dom/Element.cpp
r113990 r114189 41 41 #include "ElementRareData.h" 42 42 #include "ExceptionCode.h" 43 #include "FlowThreadController.h" 43 44 #include "FocusController.h" 44 45 #include "Frame.h" … … 983 984 RenderWidget::suspendWidgetHierarchyUpdates(); 984 985 986 if (document()->cssRegionsEnabled() && inNamedFlow()) { 987 if (document()->renderer() && document()->renderer()->view()) 988 document()->renderer()->view()->flowThreadController()->unregisterNamedFlowContentNode(this); 989 } 990 985 991 cancelFocusAppearanceUpdate(); 986 992 if (hasRareData()) -
trunk/Source/WebCore/dom/Node.h
r113897 r114189 216 216 bool isDocumentNode() const; 217 217 bool isShadowRoot() const { return getFlag(IsShadowRootFlag); } 218 bool inNamedFlow() const { return getFlag(InNamedFlowFlag); } 218 219 219 220 Node* shadowAncestorNode() const; … … 324 325 void setIsLink() { setFlag(IsLinkFlag); } 325 326 void clearIsLink() { clearFlag(IsLinkFlag); } 327 328 void setInNamedFlow() { setFlag(InNamedFlowFlag); } 329 void clearInNamedFlow() { clearFlag(InNamedFlowFlag); } 326 330 327 331 enum ShouldSetAttached { … … 666 670 667 671 #if ENABLE(SVG) 668 DefaultNodeFlags = IsParsingChildrenFinishedFlag | IsStyleAttributeValidFlag | AreSVGAttributesValidFlag 672 DefaultNodeFlags = IsParsingChildrenFinishedFlag | IsStyleAttributeValidFlag | AreSVGAttributesValidFlag, 669 673 #else 670 DefaultNodeFlags = IsParsingChildrenFinishedFlag | IsStyleAttributeValidFlag 671 #endif 674 DefaultNodeFlags = IsParsingChildrenFinishedFlag | IsStyleAttributeValidFlag, 675 #endif 676 InNamedFlowFlag = 1 << 29 672 677 }; 673 678 -
trunk/Source/WebCore/dom/NodeRenderingContext.cpp
r113842 r114189 328 328 m_flowThread = m_style->flowThread(); 329 329 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); 331 333 } 332 334 -
trunk/Source/WebCore/dom/WebKitNamedFlow.cpp
r112453 r114189 75 75 } 76 76 77 PassRefPtr<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 77 91 } // namespace WebCore 78 92 -
trunk/Source/WebCore/dom/WebKitNamedFlow.h
r112453 r114189 31 31 #define WebKitNamedFlow_h 32 32 33 #include <Node.h> 34 #include <wtf/ListHashSet.h> 33 35 #include <wtf/RefCounted.h> 34 36 #include <wtf/RefPtr.h> … … 36 38 namespace WebCore { 37 39 38 class Node;39 40 class NodeList; 40 41 class RenderNamedFlowThread; … … 51 52 bool overflow() const; 52 53 PassRefPtr<NodeList> getRegionsByContentNode(Node*); 54 PassRefPtr<NodeList> contentNodes() const; 53 55 54 56 private: -
trunk/Source/WebCore/dom/WebKitNamedFlow.idl
r111419 r114189 34 34 readonly attribute boolean overflow; 35 35 NodeList getRegionsByContentNode(in Node contentNode); 36 readonly attribute NodeList contentNodes; 36 37 }; 37 38 } -
trunk/Source/WebCore/rendering/FlowThreadController.cpp
r113842 r114189 102 102 } 103 103 104 void 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 114 void 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 104 125 } // namespace WebCore -
trunk/Source/WebCore/rendering/FlowThreadController.h
r113842 r114189 63 63 void layoutRenderNamedFlowThreads(); 64 64 65 void registerNamedFlowContentNode(Node*, RenderNamedFlowThread*); 66 void unregisterNamedFlowContentNode(Node*); 67 65 68 protected: 66 69 FlowThreadController(RenderView*); … … 71 74 bool m_isRenderNamedFlowThreadOrderDirty; 72 75 OwnPtr<RenderNamedFlowThreadList> m_renderNamedFlowThreadList; 76 // maps a content node to its render flow thread. 77 HashMap<Node*, RenderNamedFlowThread*> m_mapNamedFlowContentNodes; 73 78 }; 74 79 -
trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp
r113842 r114189 254 254 } 255 255 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. 259 void 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 277 void 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 35 35 namespace WebCore { 36 36 37 class Node; 37 38 class RenderNamedFlowThread; 38 39 class WebKitNamedFlow; … … 40 41 typedef ListHashSet<RenderNamedFlowThread*> RenderNamedFlowThreadList; 41 42 typedef HashCountedSet<RenderNamedFlowThread*> RenderNamedFlowThreadCountedSet; 43 typedef ListHashSet<Node*> NamedFlowContentNodes; 42 44 43 45 class RenderNamedFlowThread : public RenderFlowThread { … … 63 65 64 66 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); } 65 71 66 72 private: … … 91 97 FlowThreadChildList m_flowThreadChildList; 92 98 99 NamedFlowContentNodes m_contentNodes; 100 93 101 // The DOM Object that represents a named flow. 94 102 RefPtr<WebKitNamedFlow> m_namedFlow;
Note: See TracChangeset
for help on using the changeset viewer.