Commit a230a172 authored by mihnea@adobe.com's avatar mihnea@adobe.com
Browse files

[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.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@114189 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent 678bc4a1
2012-04-13 Mihnea Ovidenie <mihnea@adobe.com>
[CSSRegions]Implement NamedFlow::contentNodes attribute
https://bugs.webkit.org/show_bug.cgi?id=80134
Reviewed by David Hyatt.
* fast/regions/webkit-named-flow-content-nodes-expected.txt: Added.
* fast/regions/webkit-named-flow-content-nodes.html: Added.
2012-04-13 Simon Fraser <simon.fraser@apple.com>
 
Rebaseline some compositing tests. Some were affected by the colorspace of
Test for 80134: [CSSRegions]Implement NamedFlow::contentNodes
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS namedFlowContentNodes is non-null.
PASS namedFlowContentNodes.length is 0
PASS namedFlowContentNodes instanceof NodeList is true
PASS namedFlowContentNodes2.length is 0
PASS namedFlowContentNodes3.length is 1
PASS namedFlowContentNodes3.item(0).id is "article"
PASS namedFlowContentNodes4.length is 1
PASS namedFlowContentNodes4.item(0).id is "article"
PASS namedFlowContentNodes5.length is 2
PASS namedFlowContentNodes5.item(0).id is "article2"
PASS namedFlowContentNodes5.item(1).id is "article"
PASS namedFlowContentNodes6.length is 2
PASS namedFlowContentNodes7.length is 2
PASS namedFlowContentNodes8.length is 3
PASS namedFlowContentNodes9.length is 3
PASS namedFlowContentNodes9.item(0).id is "article2"
PASS namedFlowContentNodes9.item(1).id is "span1"
PASS namedFlowContentNodes9.item(2).id is "article"
PASS namedFlowContentNodes10.length is 3
PASS namedFlowContentNodes10.item(0).id is "article"
PASS namedFlowContentNodes11.length is 5
PASS namedFlowContentNodes12.length is 1
PASS namedFlowContentNodes12.item(0).id is "article"
PASS namedFlowContentNodes10.length is 0
PASS namedFlowContentNodes11.length is 0
PASS namedFlowContentNodes12.length is 1
PASS namedFlowContentNodes12.item(0).id is "article"
PASS namedFlowContentNodes13.length is 0
PASS namedFlowContentNodes14.length is 0
PASS successfullyParsed is true
TEST COMPLETE
<!doctype html>
<html>
<head>
<script src="../../fast/js/resources/js-test-pre.js"></script>
<style>
#region { -webkit-flow-from: flow; width: 250px; height: 150px; }
</style>
</head>
<body>
<!--
1. The content nodes collection for a named flow 'flow' contains only those elements that have
the style property -webkit-flow-into set to 'flow'.
2. If an element has an ancestor with -webkit-flow-into = 'flow' but does not have its '-webkit-flow-into'
set to 'flow' will not be listed among the content nodes for named flow 'flow'.
3. Elements with '-webkit-flow-into' set to 'flow' and 'display:none' should be listed among the content nodes
for named flow object 'flow'.
4. The collection of nodes is returned in document order.
-->
<script>
if (window.layoutTestController)
window.layoutTestController.dumpAsText();
description("Test for 80134: [CSSRegions]Implement NamedFlow::contentNodes");
// First time ask for a named flow object, the contentNodes should be empty.
var namedFlowContentNodes = document.webkitGetFlowByName("flow").contentNodes;
shouldBeNonNull("namedFlowContentNodes");
shouldEvaluateTo("namedFlowContentNodes.length", 0);
shouldBeTrue("namedFlowContentNodes instanceof NodeList");
// Add an element that would be collected by the named flow but do not add it to the DOM, the contentNodes should be empty.
var article = document.createElement("div");
article.id = "article";
article.style.webkitFlowInto = "flow";
var namedFlowContentNodes2 = document.webkitGetFlowByName("flow").contentNodes;
shouldEvaluateTo("namedFlowContentNodes2.length", 0);
// Append the above element to the DOM. It will be collected by the flow, therefore the contentNodes should have 1 element.
document.body.appendChild(article);
var namedFlowContentNodes3 = document.webkitGetFlowByName("flow").contentNodes;
shouldEvaluateTo("namedFlowContentNodes3.length", 1);
shouldBeEqualToString("namedFlowContentNodes3.item(0).id", "article");
// Append a child element to the article above but do not set its style to flow into 'flow'.
// The contentNodes should still have 1 element.
var pNode = document.createElement("p");
pNode.id = "p1";
document.getElementById("article").appendChild(pNode);
var namedFlowContentNodes4 = document.webkitGetFlowByName("flow").contentNodes;
shouldEvaluateTo("namedFlowContentNodes4.length", 1);
shouldBeEqualToString("namedFlowContentNodes4.item(0).id", "article");
// Add another element directly to the flow and set its 'display' property to 'none', it should be part of the flow.
var article2 = document.createElement("div");
article2.id = "article2";
article2.style.webkitFlowInto = "flow";
article2.style.display = "none";
document.body.insertBefore(article2, article);
var namedFlowContentNodes5 = document.webkitGetFlowByName("flow").contentNodes;
shouldEvaluateTo("namedFlowContentNodes5.length", 2);
shouldBeEqualToString("namedFlowContentNodes5.item(0).id", "article2");
shouldBeEqualToString("namedFlowContentNodes5.item(1).id", "article");
// Adding a region element to flow content into should not influence the content nodes collection.
var regionNode = document.createElement("div");
regionNode.id = "region";
document.body.appendChild(regionNode);
var namedFlowContentNodes6 = document.webkitGetFlowByName("flow").contentNodes;
shouldEvaluateTo("namedFlowContentNodes6.length", 2);
// Change display:none for the 'article2' element, the list of contentNodes should stay the same
document.getElementById("article2").style.display = "block";
var namedFlowContentNodes7 = document.webkitGetFlowByName("flow").contentNodes;
shouldEvaluateTo("namedFlowContentNodes7.length", 2);
// Add a p and a span under p. Make the span directly collected by the flow. The contentNodes collection should have 3 elements.
pNode = document.createElement("p");
pNode.id = "p2";
var spanNode = document.createElement("span");
spanNode.id = "span1";
spanNode.style.webkitFlowInto = "flow";
pNode.appendChild(spanNode);
document.getElementById("article2").appendChild(pNode);
var namedFlowContentNodes8 = document.webkitGetFlowByName("flow").contentNodes;
shouldEvaluateTo("namedFlowContentNodes8.length", 3);
// Change display of article node to none, the collection should still have 3 elements.
document.getElementById("article").style.display = "none";
var namedFlowContentNodes9 = document.webkitGetFlowByName("flow").contentNodes;
shouldEvaluateTo("namedFlowContentNodes9.length", 3);
shouldBeEqualToString("namedFlowContentNodes9.item(0).id", "article2");
shouldBeEqualToString("namedFlowContentNodes9.item(1).id", "span1");
shouldBeEqualToString("namedFlowContentNodes9.item(2).id", "article");
// Take 'article' node from last position and insert it before 'article2'
article = document.getElementById("article");
document.body.insertBefore(document.body.removeChild(article), article2);
var namedFlowContentNodes10 = document.webkitGetFlowByName("flow").contentNodes;
shouldEvaluateTo("namedFlowContentNodes10.length", 3);
shouldBeEqualToString("namedFlowContentNodes10.item(0).id", "article");
// Clone 'article2' including its children.
var article2Clone = document.getElementById("article2").cloneNode(true);
document.body.appendChild(article2Clone);
var namedFlowContentNodes11 = document.webkitGetFlowByName("flow").contentNodes;
shouldEvaluateTo("namedFlowContentNodes11.length", 5);
// Remove article2 nodes from document, they should be removed from flow.
document.body.removeChild(article2);
document.body.removeChild(article2Clone);
var namedFlowContentNodes12 = document.webkitGetFlowByName("flow").contentNodes;
shouldEvaluateTo("namedFlowContentNodes12.length", 1);
shouldBeEqualToString("namedFlowContentNodes12.item(0).id", "article");
// Get the content nodes for another flow, flow2.
var namedFlowContentNodes10 = document.webkitGetFlowByName("flow2").contentNodes;
shouldEvaluateTo("namedFlowContentNodes10.length", "0");
// Move the content node 'article' from named flow 'flow' to named flow 'flow2'
document.getElementById("article").style.webkitFlowInto = "flow2";
var namedFlowContentNodes11 = document.webkitGetFlowByName("flow").contentNodes;
var namedFlowContentNodes12 = document.webkitGetFlowByName("flow2").contentNodes;
shouldEvaluateTo("namedFlowContentNodes11.length", "0");
shouldEvaluateTo("namedFlowContentNodes12.length", "1");
shouldBeEqualToString("namedFlowContentNodes12.item(0).id", "article");
// Remove the content node from dom, content nodes for both 'flow' and 'flow2' should be empty
document.body.removeChild(document.getElementById("article"));
var namedFlowContentNodes13 = document.webkitGetFlowByName("flow").contentNodes;
var namedFlowContentNodes14 = document.webkitGetFlowByName("flow2").contentNodes;
shouldEvaluateTo("namedFlowContentNodes13.length", "0");
shouldEvaluateTo("namedFlowContentNodes14.length", "0");
document.getElementById("region").style.visibility = "hidden";
</script>
<script src="../../fast/js/resources/js-test-post.js"></script>
</body>
</html>
2012-04-13 Mihnea Ovidenie <mihnea@adobe.com>
[CSSRegions]Implement NamedFlow::contentNodes attribute
https://bugs.webkit.org/show_bug.cgi?id=80134
Reviewed by David Hyatt.
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):
2012-04-13 Jessie Berlin <jberlin@apple.com>
 
Remove the calls to CRASH() from ResourceLoader.cpp.
......@@ -1074,14 +1074,24 @@ static bool validFlowName(const String& flowName)
PassRefPtr<WebKitNamedFlow> Document::webkitGetFlowByName(const String& flowName)
{
if (!cssRegionsEnabled() || flowName.isEmpty() || !validFlowName(flowName) || !renderer())
return 0;
return webkitGetFlowByName(flowName, CheckFlowNameForInvalidValues);
}
// Make a slower check for invalid flow name
CSSParser parser(CSSStrictMode);
if (!parser.parseFlowThread(flowName, this))
PassRefPtr<WebKitNamedFlow> Document::webkitGetFlowByName(const String& flowName, FlowNameCheck flowNameCheck)
{
if (!cssRegionsEnabled() || !renderer())
return 0;
if (flowNameCheck == CheckFlowNameForInvalidValues) {
if (flowName.isEmpty() || !validFlowName(flowName))
return 0;
// Make a slower check for invalid flow name.
CSSParser parser(CSSStrictMode);
if (!parser.parseFlowThread(flowName, this))
return 0;
}
if (RenderView* view = renderer()->view())
return view->flowThreadController()->ensureRenderFlowThreadWithName(flowName)->ensureNamedFlow();
return 0;
......
......@@ -352,7 +352,12 @@ public:
PassRefPtr<Element> createElement(const QualifiedName&, bool createdByParser);
bool cssRegionsEnabled() const;
enum FlowNameCheck {
CheckFlowNameForInvalidValues,
DoNotCheckFlowNameForInvalidValues
};
PassRefPtr<WebKitNamedFlow> webkitGetFlowByName(const String&);
PassRefPtr<WebKitNamedFlow> webkitGetFlowByName(const String&, FlowNameCheck);
bool regionBasedColumnsEnabled() const;
......
......@@ -40,6 +40,7 @@
#include "DocumentFragment.h"
#include "ElementRareData.h"
#include "ExceptionCode.h"
#include "FlowThreadController.h"
#include "FocusController.h"
#include "Frame.h"
#include "FrameView.h"
......@@ -982,6 +983,11 @@ void Element::detach()
{
RenderWidget::suspendWidgetHierarchyUpdates();
if (document()->cssRegionsEnabled() && inNamedFlow()) {
if (document()->renderer() && document()->renderer()->view())
document()->renderer()->view()->flowThreadController()->unregisterNamedFlowContentNode(this);
}
cancelFocusAppearanceUpdate();
if (hasRareData())
rareData()->resetComputedStyle();
......
......@@ -215,6 +215,7 @@ public:
virtual bool isCharacterDataNode() const { return false; }
bool isDocumentNode() const;
bool isShadowRoot() const { return getFlag(IsShadowRootFlag); }
bool inNamedFlow() const { return getFlag(InNamedFlowFlag); }
Node* shadowAncestorNode() const;
// Returns 0, a ShadowRoot, or a legacy shadow root.
......@@ -324,6 +325,9 @@ public:
void setIsLink() { setFlag(IsLinkFlag); }
void clearIsLink() { clearFlag(IsLinkFlag); }
void setInNamedFlow() { setFlag(InNamedFlowFlag); }
void clearInNamedFlow() { clearFlag(InNamedFlowFlag); }
enum ShouldSetAttached {
SetAttached,
DoNotSetAttached
......@@ -665,10 +669,11 @@ private:
AttributeStyleDirtyFlag = 1 << 27,
#if ENABLE(SVG)
DefaultNodeFlags = IsParsingChildrenFinishedFlag | IsStyleAttributeValidFlag | AreSVGAttributesValidFlag
DefaultNodeFlags = IsParsingChildrenFinishedFlag | IsStyleAttributeValidFlag | AreSVGAttributesValidFlag,
#else
DefaultNodeFlags = IsParsingChildrenFinishedFlag | IsStyleAttributeValidFlag
DefaultNodeFlags = IsParsingChildrenFinishedFlag | IsStyleAttributeValidFlag,
#endif
InNamedFlowFlag = 1 << 29
};
// 3 bits remaining
......
......@@ -327,7 +327,9 @@ void NodeRenderingContext::moveToFlowThreadIfNeeded()
m_flowThread = m_style->flowThread();
ASSERT(m_node->document()->renderView());
m_parentFlowRenderer = m_node->document()->renderView()->flowThreadController()->ensureRenderFlowThreadWithName(m_flowThread);
FlowThreadController* flowThreadController = m_node->document()->renderView()->flowThreadController();
m_parentFlowRenderer = flowThreadController->ensureRenderFlowThreadWithName(m_flowThread);
flowThreadController->registerNamedFlowContentNode(m_node, m_parentFlowRenderer);
}
NodeRendererFactory::NodeRendererFactory(Node* node)
......
......@@ -74,5 +74,19 @@ PassRefPtr<NodeList> WebKitNamedFlow::getRegionsByContentNode(Node* contentNode)
return StaticNodeList::adopt(regionNodes);
}
PassRefPtr<NodeList> WebKitNamedFlow::contentNodes() const
{
m_parentFlowThread->document()->updateLayoutIgnorePendingStylesheets();
Vector<RefPtr<Node> > contentNodes;
for (NamedFlowContentNodes::const_iterator it = m_parentFlowThread->contentNodes().begin(); it != m_parentFlowThread->contentNodes().end(); ++it) {
Node* node = const_cast<Node*>(*it);
ASSERT(node->computedStyle()->flowThread() == m_parentFlowThread->flowThreadName());
contentNodes.append(node);
}
return StaticNodeList::adopt(contentNodes);
}
} // namespace WebCore
......@@ -30,12 +30,13 @@
#ifndef WebKitNamedFlow_h
#define WebKitNamedFlow_h
#include <Node.h>
#include <wtf/ListHashSet.h>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
namespace WebCore {
class Node;
class NodeList;
class RenderNamedFlowThread;
......@@ -50,6 +51,7 @@ public:
bool overflow() const;
PassRefPtr<NodeList> getRegionsByContentNode(Node*);
PassRefPtr<NodeList> contentNodes() const;
private:
WebKitNamedFlow(RenderNamedFlowThread*);
......
......@@ -33,6 +33,7 @@ module core {
] WebKitNamedFlow {
readonly attribute boolean overflow;
NodeList getRegionsByContentNode(in Node contentNode);
readonly attribute NodeList contentNodes;
};
}
......@@ -101,4 +101,25 @@ void FlowThreadController::layoutRenderNamedFlowThreads()
}
}
void FlowThreadController::registerNamedFlowContentNode(Node* contentNode, RenderNamedFlowThread* namedFlow)
{
ASSERT(contentNode && contentNode->isElementNode());
ASSERT(namedFlow);
ASSERT(!m_mapNamedFlowContentNodes.contains(contentNode));
ASSERT(!namedFlow->hasContentNode(contentNode));
m_mapNamedFlowContentNodes.add(contentNode, namedFlow);
namedFlow->registerNamedFlowContentNode(contentNode);
}
void FlowThreadController::unregisterNamedFlowContentNode(Node* contentNode)
{
ASSERT(contentNode && contentNode->isElementNode());
HashMap<Node*, RenderNamedFlowThread*>::iterator it = m_mapNamedFlowContentNodes.find(contentNode);
ASSERT(it != m_mapNamedFlowContentNodes.end());
ASSERT(it->second);
ASSERT(it->second->hasContentNode(contentNode));
it->second->unregisterNamedFlowContentNode(contentNode);
m_mapNamedFlowContentNodes.remove(contentNode);
}
} // namespace WebCore
......@@ -62,6 +62,9 @@ public:
bool hasRenderNamedFlowThreads() const { return m_renderNamedFlowThreadList && !m_renderNamedFlowThreadList->isEmpty(); }
void layoutRenderNamedFlowThreads();
void registerNamedFlowContentNode(Node*, RenderNamedFlowThread*);
void unregisterNamedFlowContentNode(Node*);
protected:
FlowThreadController(RenderView*);
......@@ -70,6 +73,8 @@ private:
RenderFlowThread* m_currentRenderFlowThread;
bool m_isRenderNamedFlowThreadOrderDirty;
OwnPtr<RenderNamedFlowThreadList> m_renderNamedFlowThreadList;
// maps a content node to its render flow thread.
HashMap<Node*, RenderNamedFlowThread*> m_mapNamedFlowContentNodes;
};
}
......
......@@ -253,4 +253,36 @@ WebKitNamedFlow* RenderNamedFlowThread::ensureNamedFlow()
return m_namedFlow.get();
}
// The content nodes list contains those nodes with -webkit-flow-into: flow.
// An element with display:none should also be listed among those nodes.
// The list of nodes is ordered.
void RenderNamedFlowThread::registerNamedFlowContentNode(Node* contentNode)
{
ASSERT(contentNode && contentNode->isElementNode());
contentNode->setInNamedFlow();
// Find the first content node following the new content node.
for (NamedFlowContentNodes::iterator it = m_contentNodes.begin(); it != m_contentNodes.end(); ++it) {
Node* node = *it;
unsigned short position = contentNode->compareDocumentPosition(node);
if (position & Node::DOCUMENT_POSITION_FOLLOWING) {
m_contentNodes.insertBefore(node, contentNode);
return;
}
}
m_contentNodes.add(contentNode);
}
void RenderNamedFlowThread::unregisterNamedFlowContentNode(Node* contentNode)
{
ASSERT(contentNode && contentNode->isElementNode());
ASSERT(m_contentNodes.contains(contentNode));
ASSERT(contentNode->inNamedFlow());
contentNode->clearInNamedFlow();
m_contentNodes.remove(contentNode);
}
}
......@@ -34,11 +34,13 @@
namespace WebCore {
class Node;
class RenderNamedFlowThread;
class WebKitNamedFlow;
typedef ListHashSet<RenderNamedFlowThread*> RenderNamedFlowThreadList;
typedef HashCountedSet<RenderNamedFlowThread*> RenderNamedFlowThreadCountedSet;
typedef ListHashSet<Node*> NamedFlowContentNodes;
class RenderNamedFlowThread : public RenderFlowThread {
public:
......@@ -62,6 +64,10 @@ public:
virtual void removeRegionFromThread(RenderRegion*) OVERRIDE;
WebKitNamedFlow* ensureNamedFlow();
void registerNamedFlowContentNode(Node*);
void unregisterNamedFlowContentNode(Node*);
const NamedFlowContentNodes& contentNodes() const { return m_contentNodes; }
bool hasContentNode(Node* contentNode) const { ASSERT(contentNode); return m_contentNodes.contains(contentNode); }
private:
virtual const char* renderName() const OVERRIDE;
......@@ -90,6 +96,8 @@ private:
typedef ListHashSet<RenderObject*> FlowThreadChildList;
FlowThreadChildList m_flowThreadChildList;
NamedFlowContentNodes m_contentNodes;
// The DOM Object that represents a named flow.
RefPtr<WebKitNamedFlow> m_namedFlow;
};
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment