ScrollingStateNode.cpp [plain text]
#include "config.h"
#include "ScrollingStateNode.h"
#if ENABLE(ASYNC_SCROLLING) || USE(COORDINATED_GRAPHICS)
#include "ScrollingStateFixedNode.h"
#include "ScrollingStateTree.h"
#include <wtf/text/TextStream.h>
#include <wtf/text/WTFString.h>
namespace WebCore {
ScrollingStateNode::ScrollingStateNode(ScrollingNodeType nodeType, ScrollingStateTree& scrollingStateTree, ScrollingNodeID nodeID)
: m_nodeType(nodeType)
, m_nodeID(nodeID)
, m_changedProperties(0)
, m_scrollingStateTree(scrollingStateTree)
, m_parent(nullptr)
{
}
ScrollingStateNode::ScrollingStateNode(const ScrollingStateNode& stateNode, ScrollingStateTree& adoptiveTree)
: m_nodeType(stateNode.nodeType())
, m_nodeID(stateNode.scrollingNodeID())
, m_changedProperties(stateNode.changedProperties())
, m_scrollingStateTree(adoptiveTree)
, m_parent(nullptr)
{
if (hasChangedProperty(ScrollLayer))
setLayer(stateNode.layer().toRepresentation(adoptiveTree.preferredLayerRepresentation()));
scrollingStateTree().addNode(this);
}
ScrollingStateNode::~ScrollingStateNode() = default;
void ScrollingStateNode::setPropertyChanged(unsigned propertyBit)
{
if (hasChangedProperty(propertyBit))
return;
m_changedProperties |= (static_cast<ChangedProperties>(1) << propertyBit);
m_scrollingStateTree.setHasChangedProperties();
}
Ref<ScrollingStateNode> ScrollingStateNode::cloneAndReset(ScrollingStateTree& adoptiveTree)
{
auto clone = this->clone(adoptiveTree);
resetChangedProperties();
cloneAndResetChildren(clone.get(), adoptiveTree);
return clone;
}
void ScrollingStateNode::cloneAndResetChildren(ScrollingStateNode& clone, ScrollingStateTree& adoptiveTree)
{
if (!m_children)
return;
for (auto& child : *m_children)
clone.appendChild(child->cloneAndReset(adoptiveTree));
}
void ScrollingStateNode::appendChild(Ref<ScrollingStateNode>&& childNode)
{
childNode->setParent(this);
if (!m_children)
m_children = std::make_unique<Vector<RefPtr<ScrollingStateNode>>>();
m_children->append(WTFMove(childNode));
}
void ScrollingStateNode::reconcileLayerPositionForViewportRect(const LayoutRect& viewportRect, ScrollingLayerPositionAction action)
{
if (!m_children)
return;
for (auto& child : *m_children)
child->reconcileLayerPositionForViewportRect(viewportRect, action);
}
void ScrollingStateNode::setLayer(const LayerRepresentation& layerRepresentation)
{
if (layerRepresentation == m_layer)
return;
m_layer = layerRepresentation;
setPropertyChanged(ScrollLayer);
}
void ScrollingStateNode::dumpProperties(TextStream& ts, ScrollingStateTreeAsTextBehavior behavior) const
{
if (behavior & ScrollingStateTreeAsTextBehaviorIncludeNodeIDs)
ts.dumpProperty("nodeID", scrollingNodeID());
if (behavior & ScrollingStateTreeAsTextBehaviorIncludeLayerIDs)
ts.dumpProperty("layerID", layer().layerID());
}
void ScrollingStateNode::dump(TextStream& ts, ScrollingStateTreeAsTextBehavior behavior) const
{
ts << "\n";
ts << indent << "(";
ts.increaseIndent();
dumpProperties(ts, behavior);
if (m_children) {
ts << "\n";
ts << indent <<"(";
{
TextStream::IndentScope indentScope(ts);
ts << "children " << children()->size();
for (auto& child : *m_children)
child->dump(ts, behavior);
ts << "\n";
}
ts << indent << ")";
}
ts << "\n";
ts.decreaseIndent();
ts << indent << ")";
}
String ScrollingStateNode::scrollingStateTreeAsText(ScrollingStateTreeAsTextBehavior behavior) const
{
TextStream ts(TextStream::LineMode::MultipleLine, TextStream::Formatting::SVGStyleRect);
dump(ts, behavior);
ts << "\n";
return ts.release();
}
}
#endif // ENABLE(ASYNC_SCROLLING) || USE(COORDINATED_GRAPHICS)