| 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 "core/paint/PaintLayerScrollableArea.h" | 5 #include "core/paint/PaintLayerScrollableArea.h" |
| 6 | 6 |
| 7 #include "core/frame/FrameView.h" | 7 #include "core/frame/FrameView.h" |
| 8 #include "core/layout/LayoutBoxModelObject.h" | 8 #include "core/layout/LayoutBoxModelObject.h" |
| 9 #include "core/layout/LayoutTestHelper.h" | 9 #include "core/layout/LayoutTestHelper.h" |
| 10 #include "core/paint/PaintLayer.h" | 10 #include "core/paint/PaintLayer.h" |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 // the outline is drawn into the decoration layer which will not be covered | 149 // the outline is drawn into the decoration layer which will not be covered |
| 150 // up. | 150 // up. |
| 151 EXPECT_TRUE(canPaintBackgroundOntoScrollingContentsLayer("scroller15")); | 151 EXPECT_TRUE(canPaintBackgroundOntoScrollingContentsLayer("scroller15")); |
| 152 | 152 |
| 153 // #scroller16 cannot paint background into scrolling contents layer because | 153 // #scroller16 cannot paint background into scrolling contents layer because |
| 154 // the scroller has a clip which would not be respected by the scrolling | 154 // the scroller has a clip which would not be respected by the scrolling |
| 155 // contents layer. | 155 // contents layer. |
| 156 EXPECT_FALSE(canPaintBackgroundOntoScrollingContentsLayer("scroller16")); | 156 EXPECT_FALSE(canPaintBackgroundOntoScrollingContentsLayer("scroller16")); |
| 157 } | 157 } |
| 158 | 158 |
| 159 TEST_F(PaintLayerScrollableAreaTest, OpaqueContainedLayersPromoted) { | 159 TEST_F(PaintLayerScrollableAreaTest, OpaqueLayersPromoted) { |
| 160 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); | 160 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); |
| 161 | 161 |
| 162 setBodyInnerHTML( | 162 setBodyInnerHTML( |
| 163 "<style>" | 163 "<style>" |
| 164 "#scroller { overflow: scroll; height: 200px; width: 200px; " | 164 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " |
| 165 "contain: paint; background: white local content-box; " | 165 "white local content-box; border: 10px solid rgba(0, 255, 0, 0.5); }" |
| 166 "border: 10px solid rgba(0, 255, 0, 0.5); }" | |
| 167 "#scrolled { height: 300px; }" | 166 "#scrolled { height: 300px; }" |
| 168 "</style>" | 167 "</style>" |
| 169 "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); | 168 "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); |
| 170 document().view()->updateAllLifecyclePhases(); | 169 document().view()->updateAllLifecyclePhases(); |
| 171 | 170 |
| 172 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); | 171 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); |
| 173 Element* scroller = document().getElementById("scroller"); | 172 Element* scroller = document().getElementById("scroller"); |
| 174 PaintLayer* paintLayer = | 173 PaintLayer* paintLayer = |
| 175 toLayoutBoxModelObject(scroller->layoutObject())->layer(); | 174 toLayoutBoxModelObject(scroller->layoutObject())->layer(); |
| 176 ASSERT_TRUE(paintLayer); | 175 ASSERT_TRUE(paintLayer); |
| 177 EXPECT_TRUE(paintLayer->needsCompositedScrolling()); | 176 EXPECT_TRUE(paintLayer->needsCompositedScrolling()); |
| 178 EXPECT_TRUE(paintLayer->graphicsLayerBacking()); | 177 EXPECT_TRUE(paintLayer->graphicsLayerBacking()); |
| 179 ASSERT_TRUE(paintLayer->graphicsLayerBackingForScrolling()); | 178 ASSERT_TRUE(paintLayer->graphicsLayerBackingForScrolling()); |
| 180 EXPECT_TRUE(paintLayer->graphicsLayerBackingForScrolling()->contentsOpaque()); | 179 EXPECT_TRUE(paintLayer->graphicsLayerBackingForScrolling()->contentsOpaque()); |
| 181 } | 180 } |
| 182 | 181 |
| 183 // Tests that we don't promote scrolling content which would not be contained. | |
| 184 // Promoting the scroller would also require promoting the positioned div | |
| 185 // which would lose subpixel anti-aliasing due to its transparent background. | |
| 186 TEST_F(PaintLayerScrollableAreaTest, NonContainedLayersNotPromoted) { | |
| 187 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); | |
| 188 | |
| 189 setBodyInnerHTML( | |
| 190 "<style>" | |
| 191 "#scroller { overflow: scroll; height: 200px; width: 200px; " | |
| 192 "background: white local content-box; " | |
| 193 "border: 10px solid rgba(0, 255, 0, 0.5); }" | |
| 194 "#scrolled { height: 300px; }" | |
| 195 "#positioned { position: relative; }" | |
| 196 "</style>" | |
| 197 "<div id=\"scroller\">" | |
| 198 " <div id=\"positioned\">Not contained by scroller.</div>" | |
| 199 " <div id=\"scrolled\"></div>" | |
| 200 "</div>"); | |
| 201 document().view()->updateAllLifecyclePhases(); | |
| 202 | |
| 203 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); | |
| 204 Element* scroller = document().getElementById("scroller"); | |
| 205 PaintLayer* paintLayer = | |
| 206 toLayoutBoxModelObject(scroller->layoutObject())->layer(); | |
| 207 ASSERT_TRUE(paintLayer); | |
| 208 EXPECT_FALSE(paintLayer->needsCompositedScrolling()); | |
| 209 EXPECT_FALSE(paintLayer->graphicsLayerBacking()); | |
| 210 EXPECT_FALSE(paintLayer->graphicsLayerBackingForScrolling()); | |
| 211 } | |
| 212 | |
| 213 TEST_F(PaintLayerScrollableAreaTest, TransparentLayersNotPromoted) { | 182 TEST_F(PaintLayerScrollableAreaTest, TransparentLayersNotPromoted) { |
| 214 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); | 183 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); |
| 215 | 184 |
| 216 setBodyInnerHTML( | 185 setBodyInnerHTML( |
| 217 "<style>" | 186 "<style>" |
| 218 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " | 187 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " |
| 219 "rgba(0, 255, 0, 0.5) local content-box; border: 10px solid rgba(0, 255, " | 188 "rgba(0, 255, 0, 0.5) local content-box; border: 10px solid rgba(0, 255, " |
| 220 "0, 0.5); contain: paint; }" | 189 "0, 0.5); }" |
| 221 "#scrolled { height: 300px; }" | 190 "#scrolled { height: 300px; }" |
| 222 "</style>" | 191 "</style>" |
| 223 "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); | 192 "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); |
| 224 document().view()->updateAllLifecyclePhases(); | 193 document().view()->updateAllLifecyclePhases(); |
| 225 | 194 |
| 226 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); | 195 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); |
| 227 Element* scroller = document().getElementById("scroller"); | 196 Element* scroller = document().getElementById("scroller"); |
| 228 PaintLayer* paintLayer = | 197 PaintLayer* paintLayer = |
| 229 toLayoutBoxModelObject(scroller->layoutObject())->layer(); | 198 toLayoutBoxModelObject(scroller->layoutObject())->layer(); |
| 230 ASSERT_TRUE(paintLayer); | 199 ASSERT_TRUE(paintLayer); |
| 231 EXPECT_FALSE(paintLayer->needsCompositedScrolling()); | 200 EXPECT_FALSE(paintLayer->needsCompositedScrolling()); |
| 232 EXPECT_FALSE(paintLayer->graphicsLayerBacking()); | 201 EXPECT_FALSE(paintLayer->graphicsLayerBacking()); |
| 233 EXPECT_FALSE(paintLayer->graphicsLayerBackingForScrolling()); | 202 EXPECT_FALSE(paintLayer->graphicsLayerBackingForScrolling()); |
| 234 } | 203 } |
| 235 | 204 |
| 236 TEST_F(PaintLayerScrollableAreaTest, OpaqueLayersDepromotedOnStyleChange) { | 205 TEST_F(PaintLayerScrollableAreaTest, OpaqueLayersDepromotedOnStyleChange) { |
| 237 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); | 206 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); |
| 238 | 207 |
| 239 setBodyInnerHTML( | 208 setBodyInnerHTML( |
| 240 "<style>" | 209 "<style>" |
| 241 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " | 210 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " |
| 242 "white local content-box; contain: paint; }" | 211 "white local content-box; }" |
| 243 "#scrolled { height: 300px; }" | 212 "#scrolled { height: 300px; }" |
| 244 "</style>" | 213 "</style>" |
| 245 "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); | 214 "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); |
| 246 document().view()->updateAllLifecyclePhases(); | 215 document().view()->updateAllLifecyclePhases(); |
| 247 | 216 |
| 248 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); | 217 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); |
| 249 Element* scroller = document().getElementById("scroller"); | 218 Element* scroller = document().getElementById("scroller"); |
| 250 PaintLayer* paintLayer = | 219 PaintLayer* paintLayer = |
| 251 toLayoutBoxModelObject(scroller->layoutObject())->layer(); | 220 toLayoutBoxModelObject(scroller->layoutObject())->layer(); |
| 252 ASSERT_TRUE(paintLayer); | 221 ASSERT_TRUE(paintLayer); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 263 EXPECT_FALSE(paintLayer->graphicsLayerBacking()); | 232 EXPECT_FALSE(paintLayer->graphicsLayerBacking()); |
| 264 EXPECT_FALSE(paintLayer->graphicsLayerBackingForScrolling()); | 233 EXPECT_FALSE(paintLayer->graphicsLayerBackingForScrolling()); |
| 265 } | 234 } |
| 266 | 235 |
| 267 TEST_F(PaintLayerScrollableAreaTest, OpaqueLayersPromotedOnStyleChange) { | 236 TEST_F(PaintLayerScrollableAreaTest, OpaqueLayersPromotedOnStyleChange) { |
| 268 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); | 237 RuntimeEnabledFeatures::setCompositeOpaqueScrollersEnabled(true); |
| 269 | 238 |
| 270 setBodyInnerHTML( | 239 setBodyInnerHTML( |
| 271 "<style>" | 240 "<style>" |
| 272 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " | 241 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " |
| 273 "rgba(255,255,255,0.5) local content-box; contain: paint; }" | 242 "rgba(255,255,255,0.5) local content-box; }" |
| 274 "#scrolled { height: 300px; }" | 243 "#scrolled { height: 300px; }" |
| 275 "</style>" | 244 "</style>" |
| 276 "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); | 245 "<div id=\"scroller\"><div id=\"scrolled\"></div></div>"); |
| 277 document().view()->updateAllLifecyclePhases(); | 246 document().view()->updateAllLifecyclePhases(); |
| 278 | 247 |
| 279 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); | 248 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); |
| 280 Element* scroller = document().getElementById("scroller"); | 249 Element* scroller = document().getElementById("scroller"); |
| 281 PaintLayer* paintLayer = | 250 PaintLayer* paintLayer = |
| 282 toLayoutBoxModelObject(scroller->layoutObject())->layer(); | 251 toLayoutBoxModelObject(scroller->layoutObject())->layer(); |
| 283 ASSERT_TRUE(paintLayer); | 252 ASSERT_TRUE(paintLayer); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 297 | 266 |
| 298 // Tests that a transform on the scroller or an ancestor will prevent promotion | 267 // Tests that a transform on the scroller or an ancestor will prevent promotion |
| 299 // TODO(flackr): Allow integer transforms as long as all of the ancestor | 268 // TODO(flackr): Allow integer transforms as long as all of the ancestor |
| 300 // transforms are also integer. | 269 // transforms are also integer. |
| 301 TEST_F(PaintLayerScrollableAreaTest, OnlyNonTransformedOpaqueLayersPromoted) { | 270 TEST_F(PaintLayerScrollableAreaTest, OnlyNonTransformedOpaqueLayersPromoted) { |
| 302 ScopedCompositeOpaqueScrollersForTest compositeOpaqueScrollers(true); | 271 ScopedCompositeOpaqueScrollersForTest compositeOpaqueScrollers(true); |
| 303 | 272 |
| 304 setBodyInnerHTML( | 273 setBodyInnerHTML( |
| 305 "<style>" | 274 "<style>" |
| 306 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " | 275 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " |
| 307 "white local content-box; contain: paint; }" | 276 "white local content-box; }" |
| 308 "#scrolled { height: 300px; }" | 277 "#scrolled { height: 300px; }" |
| 309 "</style>" | 278 "</style>" |
| 310 "<div id=\"parent\">" | 279 "<div id=\"parent\">" |
| 311 " <div id=\"scroller\"><div id=\"scrolled\"></div></div>" | 280 " <div id=\"scroller\"><div id=\"scrolled\"></div></div>" |
| 312 "</div>"); | 281 "</div>"); |
| 313 document().view()->updateAllLifecyclePhases(); | 282 document().view()->updateAllLifecyclePhases(); |
| 314 | 283 |
| 315 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); | 284 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); |
| 316 Element* parent = document().getElementById("parent"); | 285 Element* parent = document().getElementById("parent"); |
| 317 Element* scroller = document().getElementById("scroller"); | 286 Element* scroller = document().getElementById("scroller"); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 } | 320 } |
| 352 | 321 |
| 353 // Test that opacity applied to the scroller or an ancestor will cause the | 322 // Test that opacity applied to the scroller or an ancestor will cause the |
| 354 // scrolling contents layer to not be promoted. | 323 // scrolling contents layer to not be promoted. |
| 355 TEST_F(PaintLayerScrollableAreaTest, OnlyOpaqueLayersPromoted) { | 324 TEST_F(PaintLayerScrollableAreaTest, OnlyOpaqueLayersPromoted) { |
| 356 ScopedCompositeOpaqueScrollersForTest compositeOpaqueScrollers(true); | 325 ScopedCompositeOpaqueScrollersForTest compositeOpaqueScrollers(true); |
| 357 | 326 |
| 358 setBodyInnerHTML( | 327 setBodyInnerHTML( |
| 359 "<style>" | 328 "<style>" |
| 360 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " | 329 "#scroller { overflow: scroll; height: 200px; width: 200px; background: " |
| 361 "white local content-box; contain: paint; }" | 330 "white local content-box; }" |
| 362 "#scrolled { height: 300px; }" | 331 "#scrolled { height: 300px; }" |
| 363 "</style>" | 332 "</style>" |
| 364 "<div id=\"parent\">" | 333 "<div id=\"parent\">" |
| 365 " <div id=\"scroller\"><div id=\"scrolled\"></div></div>" | 334 " <div id=\"scroller\"><div id=\"scrolled\"></div></div>" |
| 366 "</div>"); | 335 "</div>"); |
| 367 document().view()->updateAllLifecyclePhases(); | 336 document().view()->updateAllLifecyclePhases(); |
| 368 | 337 |
| 369 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); | 338 EXPECT_TRUE(RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled()); |
| 370 Element* parent = document().getElementById("parent"); | 339 Element* parent = document().getElementById("parent"); |
| 371 Element* scroller = document().getElementById("scroller"); | 340 Element* scroller = document().getElementById("scroller"); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 432 ASSERT_TRUE(blackLayer); | 401 ASSERT_TRUE(blackLayer); |
| 433 | 402 |
| 434 ASSERT_EQ(ScrollbarOverlayColorTheme::ScrollbarOverlayColorThemeDark, | 403 ASSERT_EQ(ScrollbarOverlayColorTheme::ScrollbarOverlayColorThemeDark, |
| 435 noneLayer->getScrollableArea()->getScrollbarOverlayColorTheme()); | 404 noneLayer->getScrollableArea()->getScrollbarOverlayColorTheme()); |
| 436 ASSERT_EQ(ScrollbarOverlayColorTheme::ScrollbarOverlayColorThemeDark, | 405 ASSERT_EQ(ScrollbarOverlayColorTheme::ScrollbarOverlayColorThemeDark, |
| 437 whiteLayer->getScrollableArea()->getScrollbarOverlayColorTheme()); | 406 whiteLayer->getScrollableArea()->getScrollbarOverlayColorTheme()); |
| 438 ASSERT_EQ(ScrollbarOverlayColorTheme::ScrollbarOverlayColorThemeLight, | 407 ASSERT_EQ(ScrollbarOverlayColorTheme::ScrollbarOverlayColorThemeLight, |
| 439 blackLayer->getScrollableArea()->getScrollbarOverlayColorTheme()); | 408 blackLayer->getScrollableArea()->getScrollbarOverlayColorTheme()); |
| 440 } | 409 } |
| 441 } | 410 } |
| OLD | NEW |