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