ScrollingStateNode.cpp [plain text]
#include "config.h"
#include "ScrollingStateNode.h"
#if ENABLE(ASYNC_SCROLLING) || USE(COORDINATED_GRAPHICS)
#include "ScrollingStateFixedNode.h"
#include "ScrollingStateTree.h"
#include "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()
{
}
void ScrollingStateNode::setPropertyChanged(unsigned propertyBit)
{
if (m_changedProperties & (1 << propertyBit))
return;
m_changedProperties |= (1 << propertyBit);
m_scrollingStateTree.setHasChangedProperties();
}
PassRefPtr<ScrollingStateNode> ScrollingStateNode::cloneAndReset(ScrollingStateTree& adoptiveTree)
{
auto clone = this->clone(adoptiveTree);
resetChangedProperties();
cloneAndResetChildren(clone.get(), adoptiveTree);
return WTFMove(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(PassRefPtr<ScrollingStateNode> childNode)
{
childNode->setParent(this);
if (!m_children)
m_children = std::make_unique<Vector<RefPtr<ScrollingStateNode>>>();
m_children->append(childNode);
}
void ScrollingStateNode::setLayer(const LayerRepresentation& layerRepresentation)
{
if (layerRepresentation == m_layer)
return;
m_layer = layerRepresentation;
setPropertyChanged(ScrollLayer);
}
void ScrollingStateNode::dump(TextStream& ts, int indent, ScrollingStateTreeAsTextBehavior behavior) const
{
writeIndent(ts, indent);
dumpProperties(ts, indent, behavior);
if (m_children) {
writeIndent(ts, indent + 1);
ts << "(children " << children()->size() << "\n";
for (auto& child : *m_children)
child->dump(ts, indent + 2, behavior);
writeIndent(ts, indent + 1);
ts << ")\n";
}
writeIndent(ts, indent);
ts << ")\n";
}
String ScrollingStateNode::scrollingStateTreeAsText() const
{
TextStream ts(TextStream::LineMode::MultipleLine, TextStream::Formatting::SVGStyleRect);
dump(ts, 0, ScrollingStateTreeAsTextBehaviorNormal);
return ts.release();
}
}
#endif // ENABLE(ASYNC_SCROLLING) || USE(COORDINATED_GRAPHICS)