Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(789)

Side by Side Diff: third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp

Issue 2584653002: Force subtree paint property updates on local border box changes (Closed)
Patch Set: fix bugs Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/html/HTMLIFrameElement.h" 5 #include "core/html/HTMLIFrameElement.h"
6 #include "core/layout/LayoutTestHelper.h" 6 #include "core/layout/LayoutTestHelper.h"
7 #include "core/layout/LayoutTreeAsText.h" 7 #include "core/layout/LayoutTreeAsText.h"
8 #include "core/layout/api/LayoutViewItem.h" 8 #include "core/layout/api/LayoutViewItem.h"
9 #include "core/paint/ObjectPaintProperties.h" 9 #include "core/paint/ObjectPaintProperties.h"
10 #include "core/paint/PaintPropertyTreePrinter.h" 10 #include "core/paint/PaintPropertyTreePrinter.h"
(...skipping 3213 matching lines...) Expand 10 before | Expand all | Expand 10 after
3224 TEST_P(PaintPropertyTreeBuilderTest, NoPaintPropertyUpdateOnBackgroundChange) { 3224 TEST_P(PaintPropertyTreeBuilderTest, NoPaintPropertyUpdateOnBackgroundChange) {
3225 setBodyInnerHTML("<div id='div' style='background-color: blue'>DIV</div>"); 3225 setBodyInnerHTML("<div id='div' style='background-color: blue'>DIV</div>");
3226 auto* div = document().getElementById("div"); 3226 auto* div = document().getElementById("div");
3227 3227
3228 document().view()->updateAllLifecyclePhases(); 3228 document().view()->updateAllLifecyclePhases();
3229 div->setAttribute(HTMLNames::styleAttr, "background-color: green"); 3229 div->setAttribute(HTMLNames::styleAttr, "background-color: green");
3230 document().view()->updateLifecycleToLayoutClean(); 3230 document().view()->updateLifecycleToLayoutClean();
3231 EXPECT_FALSE(div->layoutObject()->needsPaintPropertyUpdate()); 3231 EXPECT_FALSE(div->layoutObject()->needsPaintPropertyUpdate());
3232 } 3232 }
3233 3233
3234 TEST_P(PaintPropertyTreeBuilderTest, AbsoluteLocalBorderBoxChanges) {
3235 setBodyInnerHTML(
3236 "<style>"
3237 " body { margin: 0 }"
3238 " #scroller { width: 3px; height: 5px; overflow: scroll; }"
3239 " #child { top: 0; left: 0; }"
3240 "</style>"
3241 "<div id='scroller'>"
3242 " <div id='child'>"
3243 " <div id='grandChild'></div>"
3244 " </div>"
3245 " <div style='height: 100px;'></div>"
3246 "</div>");
3247 document().view()->updateAllLifecyclePhases();
3248 auto* scroller = document().getElementById("scroller");
3249 auto* scrollerProperties = scroller->layoutObject()->paintProperties();
3250 auto* child = document().getElementById("child");
3251 auto* childProperties = child->layoutObject()->paintProperties();
3252 auto* childLocalBorderBox = childProperties->localBorderBoxProperties();
3253 EXPECT_EQ(childLocalBorderBox->propertyTreeState.scroll(),
3254 scrollerProperties->scroll());
3255 EXPECT_EQ(LayoutPoint(0, 0), childLocalBorderBox->paintOffset);
3256 auto* grandChild = document().getElementById("grandChild");
3257 auto* grandChildProperties = grandChild->layoutObject()->paintProperties();
3258 auto* grandChildLocalBorderBox =
3259 grandChildProperties->localBorderBoxProperties();
3260 EXPECT_EQ(LayoutPoint(0, 0), grandChildLocalBorderBox->paintOffset);
3261 EXPECT_EQ(
3262 FloatRect(0, 0, 3, 5),
3263 grandChildLocalBorderBox->propertyTreeState.clip()->clipRect().rect());
3264
3265 // Update the scroller's transform value but ensure the child's paint offset
3266 // is unchanged so subtree updates are not forced by paint offset changes.
3267 scroller->setScrollTop(7);
3268 child->setAttribute(HTMLNames::styleAttr, "position: absolute");
3269 document().view()->updateAllLifecyclePhases();
3270 EXPECT_EQ(LayoutPoint(0, 0), childLocalBorderBox->paintOffset);
3271 EXPECT_EQ(LayoutPoint(0, 0), grandChildLocalBorderBox->paintOffset);
3272 EXPECT_NE(childLocalBorderBox->propertyTreeState.scroll(),
3273 scrollerProperties->scroll());
3274 EXPECT_TRUE(childLocalBorderBox->propertyTreeState.scroll()->isRoot());
3275 EXPECT_EQ(
3276 FloatRect(0, 0, 800, 600),
3277 grandChildLocalBorderBox->propertyTreeState.clip()->clipRect().rect());
3278 }
3279
3280 TEST_P(PaintPropertyTreeBuilderTest, FixedLocalBorderBoxChanges) {
3281 setBodyInnerHTML(
3282 "<style>"
3283 " body { margin: 0 }"
3284 " #scroller { width: 3px; height: 5px; overflow: scroll; }"
3285 " #child { top: 0; left: 0; }"
3286 "</style>"
3287 "<div id='scroller'>"
3288 " <div id='child'>"
3289 " <div id='grandChild'></div>"
3290 " </div>"
3291 " <div style='height: 100px;'></div>"
3292 "</div>");
3293 document().view()->updateAllLifecyclePhases();
3294 auto* scroller = document().getElementById("scroller");
3295 auto* scrollerProperties = scroller->layoutObject()->paintProperties();
3296 auto* child = document().getElementById("child");
3297 auto* childProperties = child->layoutObject()->paintProperties();
3298 auto* childLocalBorderBox = childProperties->localBorderBoxProperties();
3299 EXPECT_EQ(childLocalBorderBox->propertyTreeState.scroll(),
3300 scrollerProperties->scroll());
3301 EXPECT_EQ(LayoutPoint(0, 0), childLocalBorderBox->paintOffset);
3302 auto* grandChild = document().getElementById("grandChild");
3303 auto* grandChildProperties = grandChild->layoutObject()->paintProperties();
3304 auto* grandChildLocalBorderBox =
3305 grandChildProperties->localBorderBoxProperties();
3306 EXPECT_EQ(LayoutPoint(0, 0), grandChildLocalBorderBox->paintOffset);
3307 EXPECT_EQ(
3308 FloatRect(0, 0, 3, 5),
3309 grandChildLocalBorderBox->propertyTreeState.clip()->clipRect().rect());
3310
3311 // Update the scroller's transform value but ensure the child's paint offset
3312 // is unchanged so subtree updates are not forced by paint offset changes.
3313 scroller->setScrollTop(7);
3314 child->setAttribute(HTMLNames::styleAttr, "position: fixed");
3315 document().view()->updateAllLifecyclePhases();
3316 EXPECT_EQ(LayoutPoint(0, 0), childLocalBorderBox->paintOffset);
3317 EXPECT_EQ(LayoutPoint(0, 0), grandChildLocalBorderBox->paintOffset);
3318 EXPECT_NE(childLocalBorderBox->propertyTreeState.scroll(),
3319 scrollerProperties->scroll());
3320 EXPECT_TRUE(childLocalBorderBox->propertyTreeState.scroll()->isRoot());
3321 EXPECT_EQ(
3322 FloatRect(0, 0, 800, 600),
3323 grandChildLocalBorderBox->propertyTreeState.clip()->clipRect().rect());
3324 }
3325
3234 } // namespace blink 3326 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698