| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/graphics/paint/PropertyTreeState.h" | 5 #include "platform/graphics/paint/PropertyTreeState.h" |
| 6 | 6 |
| 7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
| 8 | 8 |
| 9 namespace blink { | 9 namespace blink { |
| 10 | 10 |
| 11 class PropertyTreeStateTest : public ::testing::Test {}; | 11 class PropertyTreeStateTest : public ::testing::Test {}; |
| 12 | 12 |
| 13 TEST_F(PropertyTreeStateTest, TransformOnEffectOnClip) { | 13 TEST_F(PropertyTreeStateTest, TransformOnEffectOnClip) { |
| 14 RefPtr<TransformPaintPropertyNode> transform = | 14 RefPtr<TransformPaintPropertyNode> transform = |
| 15 TransformPaintPropertyNode::create(TransformPaintPropertyNode::root(), | 15 TransformPaintPropertyNode::create(TransformPaintPropertyNode::root(), |
| 16 TransformationMatrix(), | 16 TransformationMatrix(), |
| 17 FloatPoint3D()); | 17 FloatPoint3D()); |
| 18 | 18 |
| 19 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create( | 19 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create( |
| 20 ClipPaintPropertyNode::root(), TransformPaintPropertyNode::root(), | 20 ClipPaintPropertyNode::root(), TransformPaintPropertyNode::root(), |
| 21 FloatRoundedRect()); | 21 FloatRoundedRect()); |
| 22 | 22 |
| 23 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( | 23 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( |
| 24 EffectPaintPropertyNode::root(), TransformPaintPropertyNode::root(), | 24 EffectPaintPropertyNode::root(), TransformPaintPropertyNode::root(), |
| 25 clip.get(), CompositorFilterOperations(), 1.0, SkBlendMode::kSrcOver); | 25 clip.get(), CompositorFilterOperations(), 1.0, SkBlendMode::kSrcOver); |
| 26 | 26 |
| 27 PropertyTreeState state(transform.get(), clip.get(), effect.get(), | 27 PropertyTreeState state(transform.get(), clip.get(), effect.get()); |
| 28 ScrollPaintPropertyNode::root()); | |
| 29 EXPECT_EQ(PropertyTreeState::Transform, state.innermostNode()); | 28 EXPECT_EQ(PropertyTreeState::Transform, state.innermostNode()); |
| 30 | 29 |
| 31 PropertyTreeStateIterator iterator(state); | 30 PropertyTreeStateIterator iterator(state); |
| 32 EXPECT_EQ(PropertyTreeState::Effect, iterator.next()->innermostNode()); | 31 EXPECT_EQ(PropertyTreeState::Effect, iterator.next()->innermostNode()); |
| 33 EXPECT_EQ(PropertyTreeState::Clip, iterator.next()->innermostNode()); | 32 EXPECT_EQ(PropertyTreeState::Clip, iterator.next()->innermostNode()); |
| 34 EXPECT_EQ(PropertyTreeState::None, iterator.next()->innermostNode()); | 33 EXPECT_EQ(PropertyTreeState::None, iterator.next()->innermostNode()); |
| 35 } | 34 } |
| 36 | 35 |
| 37 TEST_F(PropertyTreeStateTest, RootState) { | 36 TEST_F(PropertyTreeStateTest, RootState) { |
| 38 PropertyTreeState state( | 37 PropertyTreeState state(TransformPaintPropertyNode::root(), |
| 39 TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), | 38 ClipPaintPropertyNode::root(), |
| 40 EffectPaintPropertyNode::root(), ScrollPaintPropertyNode::root()); | 39 EffectPaintPropertyNode::root()); |
| 41 EXPECT_EQ(PropertyTreeState::None, state.innermostNode()); | 40 EXPECT_EQ(PropertyTreeState::None, state.innermostNode()); |
| 42 } | 41 } |
| 43 | 42 |
| 44 TEST_F(PropertyTreeStateTest, EffectOnClipOnTransform) { | 43 TEST_F(PropertyTreeStateTest, EffectOnClipOnTransform) { |
| 45 RefPtr<TransformPaintPropertyNode> transform = | 44 RefPtr<TransformPaintPropertyNode> transform = |
| 46 TransformPaintPropertyNode::create(TransformPaintPropertyNode::root(), | 45 TransformPaintPropertyNode::create(TransformPaintPropertyNode::root(), |
| 47 TransformationMatrix(), | 46 TransformationMatrix(), |
| 48 FloatPoint3D()); | 47 FloatPoint3D()); |
| 49 | 48 |
| 50 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create( | 49 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create( |
| 51 ClipPaintPropertyNode::root(), transform.get(), FloatRoundedRect()); | 50 ClipPaintPropertyNode::root(), transform.get(), FloatRoundedRect()); |
| 52 | 51 |
| 53 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( | 52 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( |
| 54 EffectPaintPropertyNode::root(), transform.get(), clip.get(), | 53 EffectPaintPropertyNode::root(), transform.get(), clip.get(), |
| 55 CompositorFilterOperations(), 1.0, SkBlendMode::kSrcOver); | 54 CompositorFilterOperations(), 1.0, SkBlendMode::kSrcOver); |
| 56 | 55 |
| 57 PropertyTreeState state(transform.get(), clip.get(), effect.get(), | 56 PropertyTreeState state(transform.get(), clip.get(), effect.get()); |
| 58 ScrollPaintPropertyNode::root()); | |
| 59 EXPECT_EQ(PropertyTreeState::Effect, state.innermostNode()); | 57 EXPECT_EQ(PropertyTreeState::Effect, state.innermostNode()); |
| 60 | 58 |
| 61 PropertyTreeStateIterator iterator(state); | 59 PropertyTreeStateIterator iterator(state); |
| 62 EXPECT_EQ(PropertyTreeState::Clip, iterator.next()->innermostNode()); | 60 EXPECT_EQ(PropertyTreeState::Clip, iterator.next()->innermostNode()); |
| 63 EXPECT_EQ(PropertyTreeState::Transform, iterator.next()->innermostNode()); | 61 EXPECT_EQ(PropertyTreeState::Transform, iterator.next()->innermostNode()); |
| 64 EXPECT_EQ(PropertyTreeState::None, iterator.next()->innermostNode()); | 62 EXPECT_EQ(PropertyTreeState::None, iterator.next()->innermostNode()); |
| 65 } | 63 } |
| 66 | 64 |
| 67 TEST_F(PropertyTreeStateTest, ClipOnEffectOnTransform) { | 65 TEST_F(PropertyTreeStateTest, ClipOnEffectOnTransform) { |
| 68 RefPtr<TransformPaintPropertyNode> transform = | 66 RefPtr<TransformPaintPropertyNode> transform = |
| 69 TransformPaintPropertyNode::create(TransformPaintPropertyNode::root(), | 67 TransformPaintPropertyNode::create(TransformPaintPropertyNode::root(), |
| 70 TransformationMatrix(), | 68 TransformationMatrix(), |
| 71 FloatPoint3D()); | 69 FloatPoint3D()); |
| 72 | 70 |
| 73 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create( | 71 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create( |
| 74 ClipPaintPropertyNode::root(), transform.get(), FloatRoundedRect()); | 72 ClipPaintPropertyNode::root(), transform.get(), FloatRoundedRect()); |
| 75 | 73 |
| 76 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( | 74 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( |
| 77 EffectPaintPropertyNode::root(), transform.get(), | 75 EffectPaintPropertyNode::root(), transform.get(), |
| 78 ClipPaintPropertyNode::root(), CompositorFilterOperations(), 1.0, | 76 ClipPaintPropertyNode::root(), CompositorFilterOperations(), 1.0, |
| 79 SkBlendMode::kSrcOver); | 77 SkBlendMode::kSrcOver); |
| 80 | 78 |
| 81 PropertyTreeState state(transform.get(), clip.get(), effect.get(), | 79 PropertyTreeState state(transform.get(), clip.get(), effect.get()); |
| 82 ScrollPaintPropertyNode::root()); | |
| 83 EXPECT_EQ(PropertyTreeState::Clip, state.innermostNode()); | 80 EXPECT_EQ(PropertyTreeState::Clip, state.innermostNode()); |
| 84 | 81 |
| 85 PropertyTreeStateIterator iterator(state); | 82 PropertyTreeStateIterator iterator(state); |
| 86 EXPECT_EQ(PropertyTreeState::Effect, iterator.next()->innermostNode()); | 83 EXPECT_EQ(PropertyTreeState::Effect, iterator.next()->innermostNode()); |
| 87 EXPECT_EQ(PropertyTreeState::Transform, iterator.next()->innermostNode()); | 84 EXPECT_EQ(PropertyTreeState::Transform, iterator.next()->innermostNode()); |
| 88 EXPECT_EQ(PropertyTreeState::None, iterator.next()->innermostNode()); | 85 EXPECT_EQ(PropertyTreeState::None, iterator.next()->innermostNode()); |
| 89 } | 86 } |
| 90 | 87 |
| 91 TEST_F(PropertyTreeStateTest, ClipDescendantOfTransform) { | 88 TEST_F(PropertyTreeStateTest, ClipDescendantOfTransform) { |
| 92 RefPtr<TransformPaintPropertyNode> transform = | 89 RefPtr<TransformPaintPropertyNode> transform = |
| (...skipping 10 matching lines...) Expand all Loading... |
| 103 | 100 |
| 104 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( | 101 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( |
| 105 EffectPaintPropertyNode::root(), TransformPaintPropertyNode::root(), | 102 EffectPaintPropertyNode::root(), TransformPaintPropertyNode::root(), |
| 106 ClipPaintPropertyNode::root(), CompositorFilterOperations(), 1.0, | 103 ClipPaintPropertyNode::root(), CompositorFilterOperations(), 1.0, |
| 107 SkBlendMode::kSrcOver); | 104 SkBlendMode::kSrcOver); |
| 108 | 105 |
| 109 // Here the clip is inside of its own transform, but the transform is an | 106 // Here the clip is inside of its own transform, but the transform is an |
| 110 // ancestor of the clip's transform. This models situations such as | 107 // ancestor of the clip's transform. This models situations such as |
| 111 // a clip inside a scroller that applies to an absolute-positioned element | 108 // a clip inside a scroller that applies to an absolute-positioned element |
| 112 // which escapes the scroll transform but not the clip. | 109 // which escapes the scroll transform but not the clip. |
| 113 PropertyTreeState state(transform.get(), clip.get(), effect.get(), | 110 PropertyTreeState state(transform.get(), clip.get(), effect.get()); |
| 114 ScrollPaintPropertyNode::root()); | |
| 115 EXPECT_EQ(PropertyTreeState::Clip, state.innermostNode()); | 111 EXPECT_EQ(PropertyTreeState::Clip, state.innermostNode()); |
| 116 | 112 |
| 117 PropertyTreeStateIterator iterator(state); | 113 PropertyTreeStateIterator iterator(state); |
| 118 EXPECT_EQ(PropertyTreeState::Transform, iterator.next()->innermostNode()); | 114 EXPECT_EQ(PropertyTreeState::Transform, iterator.next()->innermostNode()); |
| 119 EXPECT_EQ(PropertyTreeState::Effect, iterator.next()->innermostNode()); | 115 EXPECT_EQ(PropertyTreeState::Effect, iterator.next()->innermostNode()); |
| 120 EXPECT_EQ(PropertyTreeState::None, iterator.next()->innermostNode()); | 116 EXPECT_EQ(PropertyTreeState::None, iterator.next()->innermostNode()); |
| 121 } | 117 } |
| 122 | 118 |
| 123 TEST_F(PropertyTreeStateTest, EffectDescendantOfTransform) { | 119 TEST_F(PropertyTreeStateTest, EffectDescendantOfTransform) { |
| 124 RefPtr<TransformPaintPropertyNode> transform = | 120 RefPtr<TransformPaintPropertyNode> transform = |
| (...skipping 11 matching lines...) Expand all Loading... |
| 136 FloatPoint3D()); | 132 FloatPoint3D()); |
| 137 | 133 |
| 138 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( | 134 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( |
| 139 EffectPaintPropertyNode::root(), transform2.get(), clip.get(), | 135 EffectPaintPropertyNode::root(), transform2.get(), clip.get(), |
| 140 CompositorFilterOperations(), 1.0, SkBlendMode::kSrcOver); | 136 CompositorFilterOperations(), 1.0, SkBlendMode::kSrcOver); |
| 141 | 137 |
| 142 // Here the clip is inside of its own transform, but the transform is an | 138 // Here the clip is inside of its own transform, but the transform is an |
| 143 // ancestor of the clip's transform. This models situations such as | 139 // ancestor of the clip's transform. This models situations such as |
| 144 // a clip inside a scroller that applies to an absolute-positioned element | 140 // a clip inside a scroller that applies to an absolute-positioned element |
| 145 // which escapes the scroll transform but not the clip. | 141 // which escapes the scroll transform but not the clip. |
| 146 PropertyTreeState state(transform.get(), clip.get(), effect.get(), | 142 PropertyTreeState state(transform.get(), clip.get(), effect.get()); |
| 147 ScrollPaintPropertyNode::root()); | |
| 148 EXPECT_EQ(PropertyTreeState::Effect, state.innermostNode()); | 143 EXPECT_EQ(PropertyTreeState::Effect, state.innermostNode()); |
| 149 | 144 |
| 150 PropertyTreeStateIterator iterator(state); | 145 PropertyTreeStateIterator iterator(state); |
| 151 EXPECT_EQ(PropertyTreeState::Transform, iterator.next()->innermostNode()); | 146 EXPECT_EQ(PropertyTreeState::Transform, iterator.next()->innermostNode()); |
| 152 EXPECT_EQ(PropertyTreeState::Clip, iterator.next()->innermostNode()); | 147 EXPECT_EQ(PropertyTreeState::Clip, iterator.next()->innermostNode()); |
| 153 EXPECT_EQ(PropertyTreeState::None, iterator.next()->innermostNode()); | 148 EXPECT_EQ(PropertyTreeState::None, iterator.next()->innermostNode()); |
| 154 } | 149 } |
| 155 | 150 |
| 156 TEST_F(PropertyTreeStateTest, CompositorElementIdNoElementIdOnAnyNode) { | 151 TEST_F(PropertyTreeStateTest, CompositorElementIdNoElementIdOnAnyNode) { |
| 157 PropertyTreeState state( | 152 PropertyTreeState state(TransformPaintPropertyNode::root(), |
| 158 TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), | 153 ClipPaintPropertyNode::root(), |
| 159 EffectPaintPropertyNode::root(), ScrollPaintPropertyNode::root()); | 154 EffectPaintPropertyNode::root()); |
| 160 EXPECT_EQ(CompositorElementId(), state.compositorElementId()); | 155 EXPECT_EQ(CompositorElementId(), state.compositorElementId()); |
| 161 } | 156 } |
| 162 | 157 |
| 163 TEST_F(PropertyTreeStateTest, CompositorElementIdWithElementIdOnTransformNode) { | 158 TEST_F(PropertyTreeStateTest, CompositorElementIdWithElementIdOnTransformNode) { |
| 164 CompositorElementId expectedCompositorElementId = CompositorElementId(2, 0); | 159 CompositorElementId expectedCompositorElementId = CompositorElementId(2, 0); |
| 165 RefPtr<TransformPaintPropertyNode> transform = | 160 RefPtr<TransformPaintPropertyNode> transform = |
| 166 TransformPaintPropertyNode::create( | 161 TransformPaintPropertyNode::create(TransformPaintPropertyNode::root(), |
| 167 TransformPaintPropertyNode::root(), TransformationMatrix(), | 162 TransformationMatrix(), FloatPoint3D(), |
| 168 FloatPoint3D(), nullptr, false, 0, CompositingReasonNone, | 163 false, 0, CompositingReasonNone, |
| 169 expectedCompositorElementId); | 164 expectedCompositorElementId); |
| 170 PropertyTreeState state(transform.get(), ClipPaintPropertyNode::root(), | 165 PropertyTreeState state(transform.get(), ClipPaintPropertyNode::root(), |
| 171 EffectPaintPropertyNode::root(), | 166 EffectPaintPropertyNode::root()); |
| 172 ScrollPaintPropertyNode::root()); | |
| 173 EXPECT_EQ(expectedCompositorElementId, state.compositorElementId()); | 167 EXPECT_EQ(expectedCompositorElementId, state.compositorElementId()); |
| 174 } | 168 } |
| 175 | 169 |
| 176 TEST_F(PropertyTreeStateTest, CompositorElementIdWithElementIdOnEffectNode) { | 170 TEST_F(PropertyTreeStateTest, CompositorElementIdWithElementIdOnEffectNode) { |
| 177 CompositorElementId expectedCompositorElementId = CompositorElementId(2, 0); | 171 CompositorElementId expectedCompositorElementId = CompositorElementId(2, 0); |
| 178 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( | 172 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( |
| 179 EffectPaintPropertyNode::root(), TransformPaintPropertyNode::root(), | 173 EffectPaintPropertyNode::root(), TransformPaintPropertyNode::root(), |
| 180 ClipPaintPropertyNode::root(), CompositorFilterOperations(), 1.0, | 174 ClipPaintPropertyNode::root(), CompositorFilterOperations(), 1.0, |
| 181 SkBlendMode::kSrcOver, CompositingReasonNone, | 175 SkBlendMode::kSrcOver, CompositingReasonNone, |
| 182 expectedCompositorElementId); | 176 expectedCompositorElementId); |
| 183 PropertyTreeState state(TransformPaintPropertyNode::root(), | 177 PropertyTreeState state(TransformPaintPropertyNode::root(), |
| 184 ClipPaintPropertyNode::root(), effect.get(), | 178 ClipPaintPropertyNode::root(), effect.get()); |
| 185 ScrollPaintPropertyNode::root()); | |
| 186 EXPECT_EQ(expectedCompositorElementId, state.compositorElementId()); | 179 EXPECT_EQ(expectedCompositorElementId, state.compositorElementId()); |
| 187 } | 180 } |
| 188 | 181 |
| 189 TEST_F(PropertyTreeStateTest, CompositorElementIdWithElementIdOnMultipleNodes) { | 182 TEST_F(PropertyTreeStateTest, CompositorElementIdWithElementIdOnMultipleNodes) { |
| 190 RefPtr<ScrollPaintPropertyNode> scroll = ScrollPaintPropertyNode::create( | |
| 191 ScrollPaintPropertyNode::root(), IntSize(), IntSize(), true, false, 0); | |
| 192 CompositorElementId expectedCompositorElementId = CompositorElementId(2, 0); | 183 CompositorElementId expectedCompositorElementId = CompositorElementId(2, 0); |
| 193 RefPtr<TransformPaintPropertyNode> transform = | 184 RefPtr<TransformPaintPropertyNode> transform = |
| 194 TransformPaintPropertyNode::create( | 185 TransformPaintPropertyNode::create(TransformPaintPropertyNode::root(), |
| 195 TransformPaintPropertyNode::root(), TransformationMatrix(), | 186 TransformationMatrix(), FloatPoint3D(), |
| 196 FloatPoint3D(), nullptr, false, 0, CompositingReasonNone, | 187 false, 0, CompositingReasonNone, |
| 197 expectedCompositorElementId); | 188 expectedCompositorElementId); |
| 198 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( | 189 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( |
| 199 EffectPaintPropertyNode::root(), TransformPaintPropertyNode::root(), | 190 EffectPaintPropertyNode::root(), TransformPaintPropertyNode::root(), |
| 200 ClipPaintPropertyNode::root(), CompositorFilterOperations(), 1.0, | 191 ClipPaintPropertyNode::root(), CompositorFilterOperations(), 1.0, |
| 201 SkBlendMode::kSrcOver, CompositingReasonNone, | 192 SkBlendMode::kSrcOver, CompositingReasonNone, |
| 202 expectedCompositorElementId); | 193 expectedCompositorElementId); |
| 203 PropertyTreeState state(transform.get(), ClipPaintPropertyNode::root(), | 194 PropertyTreeState state(transform.get(), ClipPaintPropertyNode::root(), |
| 204 effect.get(), scroll.get()); | 195 effect.get()); |
| 205 EXPECT_EQ(expectedCompositorElementId, state.compositorElementId()); | 196 EXPECT_EQ(expectedCompositorElementId, state.compositorElementId()); |
| 206 } | 197 } |
| 207 | 198 |
| 208 } // namespace blink | 199 } // namespace blink |
| OLD | NEW |