Use "= default" to denote default constructor or destructor
[WebKit-https.git] / Source / WebCore / page / scrolling / ScrollingStateFixedNode.cpp
1 /*
2  * Copyright (C) 2012 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "ScrollingStateFixedNode.h"
28
29 #include "GraphicsLayer.h"
30 #include "Logging.h"
31 #include "ScrollingStateTree.h"
32 #include <wtf/text/TextStream.h>
33
34 #if ENABLE(ASYNC_SCROLLING) || USE(COORDINATED_GRAPHICS)
35
36 namespace WebCore {
37
38 Ref<ScrollingStateFixedNode> ScrollingStateFixedNode::create(ScrollingStateTree& stateTree, ScrollingNodeID nodeID)
39 {
40     return adoptRef(*new ScrollingStateFixedNode(stateTree, nodeID));
41 }
42
43 ScrollingStateFixedNode::ScrollingStateFixedNode(ScrollingStateTree& tree, ScrollingNodeID nodeID)
44     : ScrollingStateNode(FixedNode, tree, nodeID)
45 {
46 }
47
48 ScrollingStateFixedNode::ScrollingStateFixedNode(const ScrollingStateFixedNode& node, ScrollingStateTree& adoptiveTree)
49     : ScrollingStateNode(node, adoptiveTree)
50     , m_constraints(FixedPositionViewportConstraints(node.viewportConstraints()))
51 {
52 }
53
54 ScrollingStateFixedNode::~ScrollingStateFixedNode() = default;
55
56 Ref<ScrollingStateNode> ScrollingStateFixedNode::clone(ScrollingStateTree& adoptiveTree)
57 {
58     return adoptRef(*new ScrollingStateFixedNode(*this, adoptiveTree));
59 }
60
61 void ScrollingStateFixedNode::updateConstraints(const FixedPositionViewportConstraints& constraints)
62 {
63     if (m_constraints == constraints)
64         return;
65
66     LOG_WITH_STREAM(Scrolling, stream << "ScrollingStateFixedNode " << scrollingNodeID() << " updateConstraints with viewport rect " << constraints.viewportRectAtLastLayout() << " layer pos at last layout " << constraints.layerPositionAtLastLayout() << " offset from top " << (constraints.layerPositionAtLastLayout().y() - constraints.viewportRectAtLastLayout().y()));
67
68     m_constraints = constraints;
69     setPropertyChanged(ViewportConstraints);
70 }
71
72 void ScrollingStateFixedNode::reconcileLayerPositionForViewportRect(const LayoutRect& viewportRect, ScrollingLayerPositionAction action)
73 {
74     FloatPoint position = m_constraints.layerPositionForViewportRect(viewportRect);
75     if (layer().representsGraphicsLayer()) {
76         auto* graphicsLayer = static_cast<GraphicsLayer*>(layer());
77
78         LOG_WITH_STREAM(Scrolling, stream << "ScrollingStateFixedNode " << scrollingNodeID() <<" reconcileLayerPositionForViewportRect " << action << " position of layer " << graphicsLayer->primaryLayerID() << " to " << position);
79         
80         switch (action) {
81         case ScrollingLayerPositionAction::Set:
82             graphicsLayer->setPosition(position);
83             break;
84
85         case ScrollingLayerPositionAction::SetApproximate:
86             graphicsLayer->setApproximatePosition(position);
87             break;
88         
89         case ScrollingLayerPositionAction::Sync:
90             graphicsLayer->syncPosition(position);
91             break;
92         }
93     }
94 }
95
96 void ScrollingStateFixedNode::dumpProperties(TextStream& ts, ScrollingStateTreeAsTextBehavior behavior) const
97 {
98     ts << "Fixed node";
99     ScrollingStateNode::dumpProperties(ts, behavior);
100
101     if (m_constraints.anchorEdges()) {
102         TextStream::GroupScope scope(ts);
103         ts << "anchor edges: ";
104         if (m_constraints.hasAnchorEdge(ViewportConstraints::AnchorEdgeLeft))
105             ts << "AnchorEdgeLeft ";
106         if (m_constraints.hasAnchorEdge(ViewportConstraints::AnchorEdgeRight))
107             ts << "AnchorEdgeRight ";
108         if (m_constraints.hasAnchorEdge(ViewportConstraints::AnchorEdgeTop))
109             ts << "AnchorEdgeTop";
110         if (m_constraints.hasAnchorEdge(ViewportConstraints::AnchorEdgeBottom))
111             ts << "AnchorEdgeBottom";
112     }
113
114     if (!m_constraints.alignmentOffset().isEmpty())
115         ts.dumpProperty("alignment offset", m_constraints.alignmentOffset());
116
117     if (!m_constraints.viewportRectAtLastLayout().isEmpty())
118         ts.dumpProperty("viewport rect at last layout", m_constraints.viewportRectAtLastLayout());
119
120     if (m_constraints.layerPositionAtLastLayout() != FloatPoint())
121         ts.dumpProperty("layer position at last layout", m_constraints.layerPositionAtLastLayout());
122 }
123
124 } // namespace WebCore
125
126 #endif // ENABLE(ASYNC_SCROLLING) || USE(COORDINATED_GRAPHICS)