Changeset 147756 in webkit
- Timestamp:
- Apr 5, 2013 10:15:09 AM (11 years ago)
- Location:
- trunk
- Files:
-
- 6 added
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r147739 r147756 1 2013-04-05 Mihai Maerean <mmaerean@adobe.com> 2 3 [CSS Regions] Elements in a region should be assignable to a named flow 4 https://bugs.webkit.org/show_bug.cgi?id=74144 5 6 Reviewed by David Hyatt. 7 8 * fast/regions/flow-body-in-html-expected.txt: Added. 9 * fast/regions/flow-body-in-html.html: Added. To test the duplicate bug #103685. 10 * fast/regions/region-content-flown-into-region-expected.html: Added. 11 * fast/regions/region-content-flown-into-region.html: Added. 12 * fast/regions/universal-selector-children-to-the-same-region-expected.txt: Added. 13 * fast/regions/universal-selector-children-to-the-same-region.html: Added. To test the duplicate bug #103685. 14 1 15 2013-04-05 Aivo Paas <aivopaas@gmail.com> 2 16 -
trunk/Source/WebCore/ChangeLog
r147751 r147756 1 2013-04-05 Mihai Maerean <mmaerean@adobe.com> 2 3 [CSS Regions] Elements in a region should be assignable to a named flow 4 https://bugs.webkit.org/show_bug.cgi?id=74144 5 6 Reviewed by David Hyatt. 7 8 DOM children of a region must not be rendered as children of the region, but can be collected in flow threads. 9 10 NodeRenderingContext::parentRenderer now creates the parent render flow thread if it doesn't exist. 11 12 Element::moveToFlowThreadIsNeeded is a virtual method that is overriden in PseudoElement to return false and 13 in SVGElement so only svg root elements can directly be collected by a render flow thread. 14 15 RenderObject::canDOMChildrenHaveRenderParent exists to optimize the code so nodes inside regions (and maybe 16 other types of renderers in the future) can still have renderers if they need to be in a flow thread while the 17 rest of renderers that can't have children skip the new instructions. 18 19 Tests: fast/regions/flow-body-in-html.html . To test the duplicate bug #103685. 20 fast/regions/region-content-flown-into-region.html 21 fast/regions/universal-selector-children-to-the-same-region.html . To test the duplicate bug #103685. 22 23 * dom/Element.cpp: 24 (WebCore::Element::moveToFlowThreadIsNeeded): 25 * dom/Element.h: 26 * dom/NodeRenderingContext.cpp: 27 (WebCore::NodeRenderingContext::parentRenderer): the renderer that will be the parent for this node's renderer. 28 In the case of RenderFlowThreads, it may need to create it. 29 (WebCore::NodeRenderingContext::shouldCreateRenderer): In a region, only the children that need to be in a flow 30 thread should have a renderer. 31 (WebCore::NodeRenderingContext::moveToFlowThreadIfNeeded): 32 (WebCore::NodeRenderingContext::moveToFlowThread): 33 * dom/NodeRenderingContext.h: 34 (NodeRenderingContext): 35 * dom/PseudoElement.h: pseudo-elements cannot be directly collected into a named flow. 36 * dom/Text.cpp: 37 (WebCore::Text::textRendererIsNeeded): 38 (WebCore::Text::updateTextRenderer): Because calling textRendererIsNeeded(NodeRenderingContext(...)) on a 39 non-const l-value NodeRenderingContext cannot be done on a temporary object on the stack. 40 * dom/Text.h: 41 * rendering/FlowThreadController.cpp: 42 (WebCore::FlowThreadController::isContentNodeRegisteredWithAnyNamedFlow): 43 * rendering/FlowThreadController.h: 44 * rendering/RenderObject.h: 45 (WebCore::RenderObject::canDOMChildrenHaveRenderParent): Even if this render object can't have render children, 46 the children in the DOM tree may have a render parent (that is different from this render object). 47 * rendering/RenderRegion.h: 48 * svg/SVGElement.cpp: 49 (WebCore::SVGElement::moveToFlowThreadIsNeeded): Allow only svg root elements to be directly collected by a 50 render flow thread. 51 * svg/SVGElement.h: 52 (SVGElement): 53 1 54 2013-04-05 Allan Sandfeld Jensen <allan.jensen@digia.com> 2 55 -
trunk/Source/WebCore/dom/Element.cpp
r147558 r147756 2559 2559 } 2560 2560 2561 bool Element::moveToFlowThreadIsNeeded(RefPtr<RenderStyle>& cachedStyle) 2562 { 2563 Document* doc = document(); 2564 2565 if (!doc->cssRegionsEnabled()) 2566 return false; 2567 2568 #if ENABLE(FULLSCREEN_API) 2569 if (doc->webkitIsFullScreen() && doc->webkitCurrentFullScreenElement() == this) 2570 return false; 2571 #endif 2572 2573 if (isInShadowTree()) 2574 return false; 2575 2576 if (!cachedStyle) 2577 cachedStyle = styleForRenderer(); 2578 if (!cachedStyle) 2579 return false; 2580 2581 if (cachedStyle->flowThread().isEmpty()) 2582 return false; 2583 2584 return !document()->renderView()->flowThreadController()->isContentNodeRegisteredWithAnyNamedFlow(this); 2585 } 2586 2561 2587 #if ENABLE(CSS_REGIONS) 2562 2588 -
trunk/Source/WebCore/dom/Element.h
r147558 r147756 610 610 611 611 RenderRegion* renderRegion() const; 612 virtual bool moveToFlowThreadIsNeeded(RefPtr<RenderStyle>& cachedStyle); 612 613 #if ENABLE(CSS_REGIONS) 613 614 const AtomicString& webkitRegionOverset() const; -
trunk/Source/WebCore/dom/NodeRenderingContext.cpp
r144461 r147756 149 149 } 150 150 151 RenderObject* NodeRenderingContext::parentRenderer() const151 RenderObject* NodeRenderingContext::parentRenderer() 152 152 { 153 153 if (RenderObject* renderer = m_node->renderer()) … … 171 171 return m_parentFlowRenderer; 172 172 173 if (m_node->isElementNode() && toElement(m_node)->moveToFlowThreadIsNeeded(m_style)) { 174 moveToFlowThread(); 175 return m_parentFlowRenderer; 176 } 177 173 178 return m_renderingParent ? m_renderingParent->renderer() : 0; 174 179 } 175 180 176 bool NodeRenderingContext::shouldCreateRenderer() const181 bool NodeRenderingContext::shouldCreateRenderer() 177 182 { 178 183 if (!m_node->document()->shouldCreateRenderers()) … … 183 188 if (!parentRenderer) 184 189 return false; 185 if (!parentRenderer->canHaveChildren()) 186 return false; 190 if (!parentRenderer->canHaveChildren()) { 191 if (parentRenderer->canDOMChildrenHaveRenderParent()) { 192 // In a region, only the children that need to be in a flow thread should have a renderer. 193 bool shouldBeInNamedFlow = m_node->isElementNode() && toElement(m_node)->moveToFlowThreadIsNeeded(m_style); 194 if (!shouldBeInNamedFlow) 195 return false; 196 } else 197 return false; 198 } 199 187 200 if (!m_renderingParent->childShouldCreateRenderer(*this)) 188 201 return false; … … 193 206 { 194 207 ASSERT(m_node->isElementNode()); 208 209 if (!toElement(m_node)->moveToFlowThreadIsNeeded(m_style)) 210 return; 211 212 moveToFlowThread(); 213 } 214 215 void NodeRenderingContext::moveToFlowThread() 216 { 217 ASSERT(m_node->isElementNode()); 218 ASSERT(toElement(m_node)->moveToFlowThreadIsNeeded(m_style)); 219 220 if (!m_style) 221 m_style = toElement(m_node)->styleForRenderer(); 195 222 ASSERT(m_style); 196 if (!m_node->document()->cssRegionsEnabled())197 return;198 199 if (m_style->flowThread().isEmpty())200 return;201 202 // As per http://dev.w3.org/csswg/css3-regions/#flow-into, pseudo-elements such as ::first-line, ::first-letter, ::before or ::after203 // cannot be directly collected into a named flow.204 if (m_node->isPseudoElement())205 return;206 207 // FIXME: Do not collect elements if they are in shadow tree.208 if (m_node->isInShadowTree())209 return;210 211 #if ENABLE(FULLSCREEN_API)212 Document* document = m_node->document();213 if (document->webkitIsFullScreen() && document->webkitCurrentFullScreenElement() == m_node)214 return;215 #endif216 217 #if ENABLE(SVG)218 // Allow only svg root elements to be directly collected by a render flow thread.219 if (m_node->isSVGElement()220 && (!(m_node->hasTagName(SVGNames::svgTag) && m_node->parentNode() && !m_node->parentNode()->isSVGElement())))221 return;222 #endif223 224 223 m_flowThread = m_style->flowThread(); 225 224 ASSERT(m_node->document()->renderView()); -
trunk/Source/WebCore/dom/NodeRenderingContext.h
r137715 r147756 56 56 ContainerNode* parentNodeForRenderingAndStyle() const; 57 57 bool resetStyleInheritance() const; 58 RenderObject* parentRenderer() const;58 RenderObject* parentRenderer(); // the renderer that will be the parent for this node's renderer. In the case of RenderFlowThreads, it may need to create it. 59 59 RenderObject* nextRenderer() const; 60 60 RenderObject* previousRenderer() const; … … 67 67 68 68 private: 69 bool shouldCreateRenderer() const; 69 bool shouldCreateRenderer(); 70 void moveToFlowThread(); 70 71 void moveToFlowThreadIfNeeded(); 71 72 -
trunk/Source/WebCore/dom/PseudoElement.h
r145057 r147756 47 47 virtual bool rendererIsNeeded(const NodeRenderingContext&) OVERRIDE; 48 48 49 // As per http://dev.w3.org/csswg/css3-regions/#flow-into, pseudo-elements such as ::first-line, ::first-letter, ::before or ::after 50 // cannot be directly collected into a named flow. 51 virtual bool moveToFlowThreadIsNeeded(RefPtr<RenderStyle>& cachedStyle) OVERRIDE 52 { 53 UNUSED_PARAM(cachedStyle); 54 return false; 55 } 56 49 57 virtual bool canStartSelection() const OVERRIDE { return false; } 50 58 virtual bool canContainRangeEndPoint() const OVERRIDE { return false; } -
trunk/Source/WebCore/dom/Text.cpp
r142271 r147756 198 198 } 199 199 200 bool Text::textRendererIsNeeded( constNodeRenderingContext& context)200 bool Text::textRendererIsNeeded(NodeRenderingContext& context) 201 201 { 202 202 if (isEditingText()) … … 303 303 return; 304 304 RenderText* textRenderer = toRenderText(renderer()); 305 if (!textRenderer || !textRendererIsNeeded(NodeRenderingContext(this, textRenderer->style()))) { 305 if (!textRenderer) { 306 reattach(); 307 return; 308 } 309 NodeRenderingContext renderingContext(this, textRenderer->style()); 310 if (!textRendererIsNeeded(renderingContext)) { 306 311 reattach(); 307 312 return; -
trunk/Source/WebCore/dom/Text.h
r141516 r147756 47 47 void recalcTextStyle(StyleChange); 48 48 void createTextRendererIfNeeded(); 49 bool textRendererIsNeeded( constNodeRenderingContext&);49 bool textRendererIsNeeded(NodeRenderingContext&); 50 50 RenderText* createTextRenderer(RenderArena*, RenderStyle*); 51 51 void updateTextRenderer(unsigned offsetOfReplacedData, unsigned lengthOfReplacedData); -
trunk/Source/WebCore/rendering/FlowThreadController.cpp
r147426 r147756 228 228 } 229 229 230 bool FlowThreadController::isContentNodeRegisteredWithAnyNamedFlow(Node* contentNode) const 231 { 232 return m_mapNamedFlowContentNodes.contains(contentNode); 233 } 234 230 235 #ifndef NDEBUG 231 236 bool FlowThreadController::isAutoLogicalHeightRegionsCountConsistent() const -
trunk/Source/WebCore/rendering/FlowThreadController.h
r147426 r147756 67 67 void registerNamedFlowContentNode(Node*, RenderNamedFlowThread*); 68 68 void unregisterNamedFlowContentNode(Node*); 69 bool isContentNodeRegisteredWithAnyNamedFlow(Node*) const; 69 70 70 71 bool hasFlowThreadsWithAutoLogicalHeightRegions() const { return m_flowThreadsWithAutoLogicalHeightRegions; } -
trunk/Source/WebCore/rendering/RenderObject.h
r147495 r147756 258 258 ////////////////////////////////////////// 259 259 virtual bool canHaveChildren() const { return virtualChildren(); } 260 virtual bool canDOMChildrenHaveRenderParent() const { return false; } // Even if this render object can't have render children, the children in the DOM tree may have a render parent (that is different from this object). 260 261 virtual bool canHaveGeneratedChildren() const; 261 262 virtual bool isChildAllowed(RenderObject*, RenderStyle*) const { return true; } -
trunk/Source/WebCore/rendering/RenderRegion.h
r146748 r147756 146 146 147 147 virtual bool canHaveChildren() const OVERRIDE { return false; } 148 virtual bool canDOMChildrenHaveRenderParent() const OVERRIDE { return true; } 148 149 149 150 virtual void insertedIntoTree() OVERRIDE; -
trunk/Source/WebCore/svg/SVGElement.cpp
r147558 r147756 451 451 452 452 return false; 453 } 454 455 bool SVGElement::moveToFlowThreadIsNeeded(RefPtr<RenderStyle>& cachedStyle) 456 { 457 // Allow only svg root elements to be directly collected by a render flow thread. 458 return parentNode() && !parentNode()->isSVGElement() && hasTagName(SVGNames::svgTag) && Element::moveToFlowThreadIsNeeded(cachedStyle); 453 459 } 454 460 -
trunk/Source/WebCore/svg/SVGElement.h
r147558 r147756 121 121 virtual bool removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture) OVERRIDE; 122 122 123 virtual bool moveToFlowThreadIsNeeded(RefPtr<RenderStyle>& cachedStyle) OVERRIDE; 124 123 125 protected: 124 126 SVGElement(const QualifiedName&, Document*, ConstructionType = CreateSVGElement);
Note: See TracChangeset
for help on using the changeset viewer.