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

Side by Side Diff: third_party/WebKit/Source/core/layout/VisualRectMappingTest.cpp

Issue 2595323003: Enable SlimmingPaintInvalidation for experiments (Closed)
Patch Set: - Created 3 years, 12 months 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/layout/LayoutTestHelper.h" 5 #include "core/layout/LayoutTestHelper.h"
6 #include "core/layout/LayoutView.h" 6 #include "core/layout/LayoutView.h"
7 #include "core/layout/PaintInvalidationState.h" 7 #include "core/layout/PaintInvalidationState.h"
8 #include "core/paint/PaintLayer.h" 8 #include "core/paint/PaintLayer.h"
9 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
10 10
11 namespace blink { 11 namespace blink {
12 12
13 class VisualRectMappingTest : public RenderingTest { 13 class VisualRectMappingTest : public RenderingTest {
14 public: 14 public:
15 VisualRectMappingTest() 15 VisualRectMappingTest()
16 : RenderingTest(SingleChildFrameLoaderClient::create()) {} 16 : RenderingTest(SingleChildFrameLoaderClient::create()) {}
17 17
18 protected: 18 protected:
19 LayoutView& layoutView() const { return *document().layoutView(); } 19 LayoutView& layoutView() const { return *document().layoutView(); }
20 20
21 void checkPaintInvalidationStateRectMapping( 21 void checkPaintInvalidationVisualRect(const LayoutObject& object) {
chrishtr 2016/12/27 19:31:36 Looks like this CL got rebased wrong on top of the
Xianzhu 2016/12/28 02:47:02 Fixed.
22 const LayoutRect& expectedRect, 22 LayoutRect rect = object.localVisualRect();
23 const LayoutRect& rect, 23 if (object.isBox())
24 const LayoutObject& object, 24 toLayoutBox(object).flipForWritingMode(rect);
25 const LayoutView& layoutView, 25 const LayoutBoxModelObject& paintInvalidationContainer =
26 const LayoutObject& paintInvalidationContainer) { 26 object.containerForPaintInvalidation();
27 Vector<const LayoutObject*> ancestors; 27 object.mapToVisualRectInAncestorSpace(&paintInvalidationContainer, rect);
28 for (const LayoutObject* ancestor = &object; ancestor != layoutView; 28 if (rect.isEmpty() && object.visualRect().isEmpty())
29 ancestor = ancestor->slowPaintInvalidationParentForTesting()) 29 return;
30 ancestors.append(ancestor); 30 // The following condition can be false if paintInvalidationContainer is
31 31 // a LayoutView and compositing is not enabled.
32 Vector<Optional<PaintInvalidationState>> paintInvalidationStates( 32 if (paintInvalidationContainer.isPaintInvalidationContainer()) {
33 ancestors.size() + 1); 33 PaintLayer::mapRectInPaintInvalidationContainerToBacking(
34 Vector<const LayoutObject*> pendingDelayedPaintInvalidations; 34 paintInvalidationContainer, rect);
35 paintInvalidationStates[0].emplace(layoutView,
36 pendingDelayedPaintInvalidations);
37 if (layoutView != object)
38 paintInvalidationStates[0]->updateForChildren(PaintInvalidationFull);
39 for (size_t i = 1; i < paintInvalidationStates.size(); ++i) {
40 paintInvalidationStates[i].emplace(*paintInvalidationStates[i - 1],
41 *ancestors[ancestors.size() - i]);
42 if (paintInvalidationStates[i]->m_currentObject != object)
43 paintInvalidationStates[i]->updateForChildren(PaintInvalidationFull);
44 } 35 }
45 36 EXPECT_EQ(rect, object.visualRect());
46 const PaintInvalidationState& paintInvalidationState =
47 *paintInvalidationStates.back();
48 ASSERT_EQ(paintInvalidationState.m_currentObject, object);
49 ASSERT_EQ(&paintInvalidationState.paintInvalidationContainer(),
50 &paintInvalidationContainer);
51
52 LayoutRect r = rect;
53 paintInvalidationState.mapLocalRectToPaintInvalidationContainer(r);
54 EXPECT_EQ(expectedRect, r);
55 } 37 }
56 }; 38 };
57 39
58 TEST_F(VisualRectMappingTest, LayoutText) { 40 TEST_F(VisualRectMappingTest, LayoutText) {
59 setBodyInnerHTML( 41 setBodyInnerHTML(
60 "<style>body { margin: 0; }</style>" 42 "<style>body { margin: 0; }</style>"
61 "<div id='container' style='overflow: scroll; width: 50px; height: 50px'>" 43 "<div id='container' style='overflow: scroll; width: 50px; height: 50px'>"
62 " <span><img style='width: 20px; height: 100px'></span>" 44 " <span><img style='width: 20px; height: 100px'></span>"
63 " text text text text text text text" 45 " text text text text text text text"
64 "</div>"); 46 "</div>");
65 47
66 LayoutBlock* container = 48 LayoutBlock* container =
67 toLayoutBlock(getLayoutObjectByElementId("container")); 49 toLayoutBlock(getLayoutObjectByElementId("container"));
68 LayoutText* text = toLayoutText(container->lastChild()); 50 LayoutText* text = toLayoutText(container->lastChild());
69 51
70 container->setScrollTop(LayoutUnit(50)); 52 container->setScrollTop(LayoutUnit(50));
53 document().view()->updateAllLifecyclePhases();
54
71 LayoutRect originalRect(0, 60, 20, 80); 55 LayoutRect originalRect(0, 60, 20, 80);
72 LayoutRect rect = originalRect; 56 LayoutRect rect = originalRect;
73 EXPECT_TRUE(text->mapToVisualRectInAncestorSpace(container, rect)); 57 EXPECT_TRUE(text->mapToVisualRectInAncestorSpace(container, rect));
74 rect.move(-container->scrolledContentOffset()); 58 rect.move(-container->scrolledContentOffset());
75 EXPECT_EQ(rect, LayoutRect(0, 10, 20, 80)); 59 EXPECT_EQ(rect, LayoutRect(0, 10, 20, 80));
76 60
77 rect = originalRect; 61 rect = originalRect;
78 EXPECT_TRUE(text->mapToVisualRectInAncestorSpace(&layoutView(), rect)); 62 EXPECT_TRUE(text->mapToVisualRectInAncestorSpace(&layoutView(), rect));
79 EXPECT_EQ(rect, LayoutRect(0, 10, 20, 40)); 63 EXPECT_EQ(rect, LayoutRect(0, 10, 20, 40));
80 checkPaintInvalidationStateRectMapping(rect, originalRect, *text, 64
81 layoutView(), layoutView()); 65 checkPaintInvalidationVisualRect(*text);
82 66
83 rect = LayoutRect(0, 60, 80, 0); 67 rect = LayoutRect(0, 60, 80, 0);
84 EXPECT_TRUE( 68 EXPECT_TRUE(
85 text->mapToVisualRectInAncestorSpace(container, rect, EdgeInclusive)); 69 text->mapToVisualRectInAncestorSpace(container, rect, EdgeInclusive));
86 rect.move(-container->scrolledContentOffset()); 70 rect.move(-container->scrolledContentOffset());
87 EXPECT_EQ(rect, LayoutRect(0, 10, 80, 0)); 71 EXPECT_EQ(rect, LayoutRect(0, 10, 80, 0));
88 } 72 }
89 73
90 TEST_F(VisualRectMappingTest, LayoutInline) { 74 TEST_F(VisualRectMappingTest, LayoutInline) {
91 document().setBaseURLOverride(KURL(ParsedURLString, "http://test.com")); 75 document().setBaseURLOverride(KURL(ParsedURLString, "http://test.com"));
92 setBodyInnerHTML( 76 setBodyInnerHTML(
93 "<style>body { margin: 0; }</style>" 77 "<style>body { margin: 0; }</style>"
94 "<div id='container' style='overflow: scroll; width: 50px; height: 50px'>" 78 "<div id='container' style='overflow: scroll; width: 50px; height: 50px'>"
95 " <span><img style='width: 20px; height: 100px'></span>" 79 " <span><img style='width: 20px; height: 100px'></span>"
96 " <span id=leaf></span></div>"); 80 " <span id='leaf'></span>"
81 "</div>");
97 82
98 LayoutBlock* container = 83 LayoutBlock* container =
99 toLayoutBlock(getLayoutObjectByElementId("container")); 84 toLayoutBlock(getLayoutObjectByElementId("container"));
100 LayoutObject* leaf = container->lastChild(); 85 LayoutObject* leaf = container->lastChild();
101 86
102 container->setScrollTop(LayoutUnit(50)); 87 container->setScrollTop(LayoutUnit(50));
88 document().view()->updateAllLifecyclePhases();
89
103 LayoutRect originalRect(0, 60, 20, 80); 90 LayoutRect originalRect(0, 60, 20, 80);
104 LayoutRect rect = originalRect; 91 LayoutRect rect = originalRect;
105 EXPECT_TRUE(leaf->mapToVisualRectInAncestorSpace(container, rect)); 92 EXPECT_TRUE(leaf->mapToVisualRectInAncestorSpace(container, rect));
106 rect.move(-container->scrolledContentOffset()); 93 rect.move(-container->scrolledContentOffset());
107 EXPECT_EQ(rect, LayoutRect(0, 10, 20, 80)); 94 EXPECT_EQ(rect, LayoutRect(0, 10, 20, 80));
108 95
109 rect = originalRect; 96 rect = originalRect;
110 EXPECT_TRUE(leaf->mapToVisualRectInAncestorSpace(&layoutView(), rect)); 97 EXPECT_TRUE(leaf->mapToVisualRectInAncestorSpace(&layoutView(), rect));
111 EXPECT_EQ(rect, LayoutRect(0, 10, 20, 40)); 98 EXPECT_EQ(rect, LayoutRect(0, 10, 20, 40));
112 checkPaintInvalidationStateRectMapping(rect, originalRect, *leaf, 99
113 layoutView(), layoutView()); 100 checkPaintInvalidationVisualRect(*leaf);
114 101
115 rect = LayoutRect(0, 60, 80, 0); 102 rect = LayoutRect(0, 60, 80, 0);
116 EXPECT_TRUE( 103 EXPECT_TRUE(
117 leaf->mapToVisualRectInAncestorSpace(container, rect, EdgeInclusive)); 104 leaf->mapToVisualRectInAncestorSpace(container, rect, EdgeInclusive));
118 rect.move(-container->scrolledContentOffset()); 105 rect.move(-container->scrolledContentOffset());
119 EXPECT_EQ(rect, LayoutRect(0, 10, 80, 0)); 106 EXPECT_EQ(rect, LayoutRect(0, 10, 80, 0));
120 } 107 }
121 108
122 TEST_F(VisualRectMappingTest, LayoutView) { 109 TEST_F(VisualRectMappingTest, LayoutView) {
123 document().setBaseURLOverride(KURL(ParsedURLString, "http://test.com")); 110 document().setBaseURLOverride(KURL(ParsedURLString, "http://test.com"));
124 setBodyInnerHTML( 111 setBodyInnerHTML(
125 "<style>body { margin: 0; }</style>" 112 "<style>body { margin: 0; }</style>"
126 "<div id=frameContainer>" 113 "<div id=frameContainer>"
127 " <iframe src='http://test.com' width='50' height='50' " 114 " <iframe src='http://test.com' width='50' height='50' "
128 "frameBorder='0'></iframe>" 115 " frameBorder='0'></iframe>"
129 "</div>"); 116 "</div>");
130 setChildFrameHTML( 117 setChildFrameHTML(
131 "<style>body { margin: 0; }</style><span><img style='width: 20px; " 118 "<style>body { margin: 0; }</style>"
132 "height: 100px'></span>text text text"); 119 "<span><img style='width: 20px; height: 100px'></span>text text text");
133
134 document().view()->updateAllLifecyclePhases(); 120 document().view()->updateAllLifecyclePhases();
135 121
136 LayoutBlock* frameContainer = 122 LayoutBlock* frameContainer =
137 toLayoutBlock(getLayoutObjectByElementId("frameContainer")); 123 toLayoutBlock(getLayoutObjectByElementId("frameContainer"));
138 LayoutBlock* frameBody = 124 LayoutBlock* frameBody =
139 toLayoutBlock(childDocument().body()->layoutObject()); 125 toLayoutBlock(childDocument().body()->layoutObject());
140 LayoutText* frameText = toLayoutText(frameBody->lastChild()); 126 LayoutText* frameText = toLayoutText(frameBody->lastChild());
141 127
142 // This case involves clipping: frame height is 50, y-coordinate of result 128 // This case involves clipping: frame height is 50, y-coordinate of result
143 // rect is 13, so height should be clipped to (50 - 13) == 37. 129 // rect is 13, so height should be clipped to (50 - 13) == 37.
144 childDocument().view()->setScrollOffset(ScrollOffset(0, 47), 130 childDocument().view()->setScrollOffset(ScrollOffset(0, 47),
145 ProgrammaticScroll); 131 ProgrammaticScroll);
132 document().view()->updateAllLifecyclePhases();
133
146 LayoutRect originalRect(4, 60, 20, 80); 134 LayoutRect originalRect(4, 60, 20, 80);
147 LayoutRect rect = originalRect; 135 LayoutRect rect = originalRect;
148 EXPECT_TRUE(frameText->mapToVisualRectInAncestorSpace(frameContainer, rect)); 136 EXPECT_TRUE(frameText->mapToVisualRectInAncestorSpace(frameContainer, rect));
149 EXPECT_EQ(rect, LayoutRect(4, 13, 20, 37)); 137 EXPECT_EQ(rect, LayoutRect(4, 13, 20, 37));
150 138
151 rect = originalRect; 139 rect = originalRect;
152 EXPECT_TRUE(frameText->mapToVisualRectInAncestorSpace(&layoutView(), rect)); 140 EXPECT_TRUE(frameText->mapToVisualRectInAncestorSpace(&layoutView(), rect));
153 EXPECT_EQ(rect, LayoutRect(4, 13, 20, 37)); 141 EXPECT_EQ(rect, LayoutRect(4, 13, 20, 37));
154 checkPaintInvalidationStateRectMapping(rect, originalRect, *frameText, 142
155 layoutView(), layoutView()); 143 checkPaintInvalidationVisualRect(*frameText);
156 144
157 rect = LayoutRect(4, 60, 0, 80); 145 rect = LayoutRect(4, 60, 0, 80);
158 EXPECT_TRUE(frameText->mapToVisualRectInAncestorSpace(frameContainer, rect, 146 EXPECT_TRUE(frameText->mapToVisualRectInAncestorSpace(frameContainer, rect,
159 EdgeInclusive)); 147 EdgeInclusive));
160 EXPECT_EQ(rect, LayoutRect(4, 13, 0, 37)); 148 EXPECT_EQ(rect, LayoutRect(4, 13, 0, 37));
161 } 149 }
162 150
163 TEST_F(VisualRectMappingTest, LayoutViewSubpixelRounding) { 151 TEST_F(VisualRectMappingTest, LayoutViewSubpixelRounding) {
164 document().setBaseURLOverride(KURL(ParsedURLString, "http://test.com")); 152 document().setBaseURLOverride(KURL(ParsedURLString, "http://test.com"));
165 setBodyInnerHTML( 153 setBodyInnerHTML(
166 "<style>body { margin: 0; }</style>" 154 "<style>body { margin: 0; }</style>"
167 "<div id=frameContainer style='position: relative; left: 0.5px'>" 155 "<div id=frameContainer style='position: relative; left: 0.5px'>"
168 " <iframe style='position: relative; left: 0.5px' " 156 " <iframe style='position: relative; left: 0.5px' width='200'"
169 "src='http://test.com' width='200' height='200' frameBorder='0'></iframe>" 157 " height='200' src='http://test.com' frameBorder='0'></iframe>"
170 "</div>"); 158 "</div>");
171 setChildFrameHTML( 159 setChildFrameHTML(
172 "<style>body { margin: 0; }</style><div id='target' style='position: " 160 "<style>body { margin: 0; }</style>"
173 "relative; width: 100px; height: 100px; left: 0.5px'>"); 161 "<div id='target' style='position: relative; width: 100px; height: 100px;"
162 " left: 0.5px'></div>");
174 163
175 document().view()->updateAllLifecyclePhases(); 164 document().view()->updateAllLifecyclePhases();
176 165
177 LayoutBlock* frameContainer = 166 LayoutBlock* frameContainer =
178 toLayoutBlock(getLayoutObjectByElementId("frameContainer")); 167 toLayoutBlock(getLayoutObjectByElementId("frameContainer"));
179 LayoutObject* target = 168 LayoutObject* target =
180 childDocument().getElementById("target")->layoutObject(); 169 childDocument().getElementById("target")->layoutObject();
181 LayoutRect rect(0, 0, 100, 100); 170 LayoutRect rect(0, 0, 100, 100);
182 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(frameContainer, rect)); 171 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(frameContainer, rect));
183 // When passing from the iframe to the parent frame, the rect of (0.5, 0, 100, 172 // When passing from the iframe to the parent frame, the rect of (0.5, 0, 100,
184 // 100) is expanded to (0, 0, 100, 100), and then offset by the 0.5 offset of 173 // 100) is expanded to (0, 0, 100, 100), and then offset by the 0.5 offset of
185 // frameContainer. 174 // frameContainer.
186 EXPECT_EQ(LayoutRect(LayoutPoint(DoublePoint(0.5, 0)), LayoutSize(101, 100)), 175 EXPECT_EQ(LayoutRect(LayoutPoint(DoublePoint(0.5, 0)), LayoutSize(101, 100)),
187 rect); 176 rect);
188 } 177 }
189 178
190 TEST_F(VisualRectMappingTest, LayoutViewDisplayNone) { 179 TEST_F(VisualRectMappingTest, LayoutViewDisplayNone) {
191 document().setBaseURLOverride(KURL(ParsedURLString, "http://test.com")); 180 document().setBaseURLOverride(KURL(ParsedURLString, "http://test.com"));
192 setBodyInnerHTML( 181 setBodyInnerHTML(
193 "<style>body { margin: 0; }</style>" 182 "<style>body { margin: 0; }</style>"
194 "<div id=frameContainer>" 183 "<div id=frameContainer>"
195 " <iframe id='frame' src='http://test.com' width='50' height='50' " 184 " <iframe id='frame' src='http://test.com' width='50' height='50' "
196 "frameBorder='0'></iframe>" 185 " frameBorder='0'></iframe>"
197 "</div>"); 186 "</div>");
198 setChildFrameHTML( 187 setChildFrameHTML(
199 "<style>body { margin: 0; }</style><div " 188 "<style>body { margin: 0; }</style>"
200 "style='width:100px;height:100px;'></div>"); 189 "<div style='width:100px;height:100px;'></div>");
201
202 document().view()->updateAllLifecyclePhases(); 190 document().view()->updateAllLifecyclePhases();
203 191
204 LayoutBlock* frameContainer = 192 LayoutBlock* frameContainer =
205 toLayoutBlock(getLayoutObjectByElementId("frameContainer")); 193 toLayoutBlock(getLayoutObjectByElementId("frameContainer"));
206 LayoutBlock* frameBody = 194 LayoutBlock* frameBody =
207 toLayoutBlock(childDocument().body()->layoutObject()); 195 toLayoutBlock(childDocument().body()->layoutObject());
208 LayoutBlock* frameDiv = toLayoutBlock(frameBody->lastChild()); 196 LayoutBlock* frameDiv = toLayoutBlock(frameBody->lastChild());
209 197
210 // This part is copied from the LayoutView test, just to ensure that the 198 // This part is copied from the LayoutView test, just to ensure that the
211 // mapped rect is valid before display:none is set on the iframe. 199 // mapped rect is valid before display:none is set on the iframe.
212 childDocument().view()->setScrollOffset(ScrollOffset(0, 47), 200 childDocument().view()->setScrollOffset(ScrollOffset(0, 47),
213 ProgrammaticScroll); 201 ProgrammaticScroll);
202 document().view()->updateAllLifecyclePhases();
203
214 LayoutRect originalRect(4, 60, 20, 80); 204 LayoutRect originalRect(4, 60, 20, 80);
215 LayoutRect rect = originalRect; 205 LayoutRect rect = originalRect;
216 EXPECT_TRUE(frameDiv->mapToVisualRectInAncestorSpace(frameContainer, rect)); 206 EXPECT_TRUE(frameDiv->mapToVisualRectInAncestorSpace(frameContainer, rect));
217 EXPECT_EQ(rect, LayoutRect(4, 13, 20, 37)); 207 EXPECT_EQ(rect, LayoutRect(4, 13, 20, 37));
218 208
219 Element* frameElement = document().getElementById("frame"); 209 Element* frameElement = document().getElementById("frame");
220 frameElement->setInlineStyleProperty(CSSPropertyDisplay, "none"); 210 frameElement->setInlineStyleProperty(CSSPropertyDisplay, "none");
221 document().view()->updateAllLifecyclePhases(); 211 document().view()->updateAllLifecyclePhases();
222 212
223 rect = originalRect; 213 rect = originalRect;
224 EXPECT_FALSE(frameDiv->mapToVisualRectInAncestorSpace(&layoutView(), rect)); 214 EXPECT_FALSE(frameDiv->mapToVisualRectInAncestorSpace(&layoutView(), rect));
225 EXPECT_EQ(rect, LayoutRect()); 215 EXPECT_EQ(rect, LayoutRect());
226 } 216 }
227 217
228 TEST_F(VisualRectMappingTest, SelfFlippedWritingMode) { 218 TEST_F(VisualRectMappingTest, SelfFlippedWritingMode) {
229 setBodyInnerHTML( 219 setBodyInnerHTML(
230 "<div id='target' style='writing-mode: vertical-rl; box-shadow: 40px " 220 "<div id='target' style='writing-mode: vertical-rl;"
231 "20px black;" 221 " box-shadow: 40px 20px black; width: 100px; height: 50px;"
232 " width: 100px; height: 50px; position: absolute; top: 111px; left: " 222 " position: absolute; top: 111px; left: 222px'>"
233 "222px'>"
234 "</div>"); 223 "</div>");
235 224
236 LayoutBlock* target = toLayoutBlock(getLayoutObjectByElementId("target")); 225 LayoutBlock* target = toLayoutBlock(getLayoutObjectByElementId("target"));
237 LayoutRect visualRect = target->localVisualRect(); 226 LayoutRect localVisualRect = target->localVisualRect();
238 // -40 = -box_shadow_offset_x(40) (with target's top-right corner as the 227 // -40 = -box_shadow_offset_x(40) (with target's top-right corner as the
239 // origin) 228 // origin)
240 // 140 = width(100) + box_shadow_offset_x(40) 229 // 140 = width(100) + box_shadow_offset_x(40)
241 // 70 = height(50) + box_shadow_offset_y(20) 230 // 70 = height(50) + box_shadow_offset_y(20)
242 EXPECT_EQ(LayoutRect(-40, 0, 140, 70), visualRect); 231 EXPECT_EQ(LayoutRect(-40, 0, 140, 70), localVisualRect);
243 232
244 LayoutRect rect = visualRect; 233 LayoutRect rect = localVisualRect;
245 // TODO(wkorman): The calls to flipForWritingMode() here and in other test 234 // TODO(wkorman): The calls to flipForWritingMode() here and in other test
246 // cases below are necessary because mapToVisualRectInAncestorSpace() 235 // cases below are necessary because mapToVisualRectInAncestorSpace()
247 // currently expects the input rect to be in "physical coordinates" (*not* 236 // currently expects the input rect to be in "physical coordinates" (*not*
248 // "physical coordinates with flipped block-flow direction"), see 237 // "physical coordinates with flipped block-flow direction"), see
249 // LayoutBoxModelObject.h. 238 // LayoutBoxModelObject.h.
250 target->flipForWritingMode(rect); 239 target->flipForWritingMode(rect);
251 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(target, rect)); 240 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(target, rect));
252 // This rect is in physical coordinates of target. 241 // This rect is in physical coordinates of target.
253 EXPECT_EQ(LayoutRect(0, 0, 140, 70), rect); 242 EXPECT_EQ(LayoutRect(0, 0, 140, 70), rect);
254 243
255 rect = visualRect; 244 rect = localVisualRect;
256 target->flipForWritingMode(rect); 245 target->flipForWritingMode(rect);
257 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(&layoutView(), rect)); 246 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(&layoutView(), rect));
258 EXPECT_EQ(LayoutRect(222, 111, 140, 70), rect); 247 EXPECT_EQ(LayoutRect(222, 111, 140, 70), rect);
259 checkPaintInvalidationStateRectMapping(rect, visualRect, *target, 248 EXPECT_EQ(rect, target->visualRect());
260 layoutView(), layoutView());
261 } 249 }
262 250
263 TEST_F(VisualRectMappingTest, ContainerFlippedWritingMode) { 251 TEST_F(VisualRectMappingTest, ContainerFlippedWritingMode) {
264 setBodyInnerHTML( 252 setBodyInnerHTML(
265 "<div id='container' style='writing-mode: vertical-rl; position: " 253 "<div id='container' style='writing-mode: vertical-rl;"
266 "absolute; top: 111px; left: 222px'>" 254 " position: absolute; top: 111px; left: 222px'>"
267 " <div id='target' style='box-shadow: 40px 20px black; width: 100px; " 255 " <div id='target' style='box-shadow: 40px 20px black; width: 100px;"
268 "height: 90px'></div>" 256 " height: 90px'></div>"
269 " <div style='width: 100px; height: 100px'></div>" 257 " <div style='width: 100px; height: 100px'></div>"
270 "</div>"); 258 "</div>");
271 259
272 LayoutBlock* target = toLayoutBlock(getLayoutObjectByElementId("target")); 260 LayoutBlock* target = toLayoutBlock(getLayoutObjectByElementId("target"));
273 LayoutRect targetVisualRect = target->localVisualRect(); 261 LayoutRect targetLocalVisualRect = target->localVisualRect();
274 // -40 = -box_shadow_offset_x(40) (with target's top-right corner as the 262 // -40 = -box_shadow_offset_x(40) (with target's top-right corner as the
275 // origin) 263 // origin)
276 // 140 = width(100) + box_shadow_offset_x(40) 264 // 140 = width(100) + box_shadow_offset_x(40)
277 // 110 = height(90) + box_shadow_offset_y(20) 265 // 110 = height(90) + box_shadow_offset_y(20)
278 EXPECT_EQ(LayoutRect(-40, 0, 140, 110), targetVisualRect); 266 EXPECT_EQ(LayoutRect(-40, 0, 140, 110), targetLocalVisualRect);
279 267
280 LayoutRect rect = targetVisualRect; 268 LayoutRect rect = targetLocalVisualRect;
281 target->flipForWritingMode(rect); 269 target->flipForWritingMode(rect);
282 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(target, rect)); 270 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(target, rect));
283 // This rect is in physical coordinates of target. 271 // This rect is in physical coordinates of target.
284 EXPECT_EQ(LayoutRect(0, 0, 140, 110), rect); 272 EXPECT_EQ(LayoutRect(0, 0, 140, 110), rect);
285 273
286 LayoutBlock* container = 274 LayoutBlock* container =
287 toLayoutBlock(getLayoutObjectByElementId("container")); 275 toLayoutBlock(getLayoutObjectByElementId("container"));
288 rect = targetVisualRect; 276 rect = targetLocalVisualRect;
289 target->flipForWritingMode(rect); 277 target->flipForWritingMode(rect);
290 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(container, rect)); 278 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(container, rect));
291 // 100 is the physical x location of target in container. 279 // 100 is the physical x location of target in container.
292 EXPECT_EQ(LayoutRect(100, 0, 140, 110), rect); 280 EXPECT_EQ(LayoutRect(100, 0, 140, 110), rect);
293 rect = targetVisualRect; 281 rect = targetLocalVisualRect;
294 target->flipForWritingMode(rect); 282 target->flipForWritingMode(rect);
295 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(&layoutView(), rect)); 283 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(&layoutView(), rect));
296 EXPECT_EQ(LayoutRect(322, 111, 140, 110), rect); 284 EXPECT_EQ(LayoutRect(322, 111, 140, 110), rect);
297 checkPaintInvalidationStateRectMapping(rect, targetVisualRect, *target, 285 EXPECT_EQ(rect, target->visualRect());
298 layoutView(), layoutView());
299 286
300 LayoutRect containerVisualRect = container->localVisualRect(); 287 LayoutRect containerLocalVisualRect = container->localVisualRect();
301 EXPECT_EQ(LayoutRect(0, 0, 200, 100), containerVisualRect); 288 EXPECT_EQ(LayoutRect(0, 0, 200, 100), containerLocalVisualRect);
302 rect = containerVisualRect; 289 rect = containerLocalVisualRect;
303 container->flipForWritingMode(rect); 290 container->flipForWritingMode(rect);
304 EXPECT_TRUE(container->mapToVisualRectInAncestorSpace(container, rect)); 291 EXPECT_TRUE(container->mapToVisualRectInAncestorSpace(container, rect));
305 EXPECT_EQ(LayoutRect(0, 0, 200, 100), rect); 292 EXPECT_EQ(LayoutRect(0, 0, 200, 100), rect);
306 rect = containerVisualRect; 293 rect = containerLocalVisualRect;
307 container->flipForWritingMode(rect); 294 container->flipForWritingMode(rect);
308 EXPECT_TRUE(container->mapToVisualRectInAncestorSpace(&layoutView(), rect)); 295 EXPECT_TRUE(container->mapToVisualRectInAncestorSpace(&layoutView(), rect));
309 EXPECT_EQ(LayoutRect(222, 111, 200, 100), rect); 296 EXPECT_EQ(LayoutRect(222, 111, 200, 100), rect);
310 checkPaintInvalidationStateRectMapping(rect, containerVisualRect, *container, 297 EXPECT_EQ(rect, container->visualRect());
311 layoutView(), layoutView());
312 } 298 }
313 299
314 TEST_F(VisualRectMappingTest, ContainerOverflowScroll) { 300 TEST_F(VisualRectMappingTest, ContainerOverflowScroll) {
315 setBodyInnerHTML( 301 setBodyInnerHTML(
316 "<div id='container' style='position: absolute; top: 111px; left: 222px;" 302 "<div id='container' style='position: absolute; top: 111px; left: 222px;"
317 " border: 10px solid red; overflow: scroll; width: 50px; height: " 303 " border: 10px solid red; overflow: scroll; width: 50px;"
318 "80px;'>" 304 " height: 80px'>"
319 " <div id='target' style='box-shadow: 40px 20px black; width: 100px; " 305 " <div id='target' style='box-shadow: 40px 20px black; width: 100px;"
320 "height: 90px'></div>" 306 " height: 90px'></div>"
321 "</div>"); 307 "</div>");
322 308
323 LayoutBlock* container = 309 LayoutBlock* container =
324 toLayoutBlock(getLayoutObjectByElementId("container")); 310 toLayoutBlock(getLayoutObjectByElementId("container"));
325 EXPECT_EQ(LayoutUnit(), container->scrollTop()); 311 EXPECT_EQ(LayoutUnit(), container->scrollTop());
326 EXPECT_EQ(LayoutUnit(), container->scrollLeft()); 312 EXPECT_EQ(LayoutUnit(), container->scrollLeft());
327 container->setScrollTop(LayoutUnit(7)); 313 container->setScrollTop(LayoutUnit(7));
328 container->setScrollLeft(LayoutUnit(8)); 314 container->setScrollLeft(LayoutUnit(8));
329 document().view()->updateAllLifecyclePhases(); 315 document().view()->updateAllLifecyclePhases();
330 316
331 LayoutBlock* target = toLayoutBlock(getLayoutObjectByElementId("target")); 317 LayoutBlock* target = toLayoutBlock(getLayoutObjectByElementId("target"));
332 LayoutRect targetVisualRect = target->localVisualRect(); 318 LayoutRect targetLocalVisualRect = target->localVisualRect();
333 // 140 = width(100) + box_shadow_offset_x(40) 319 // 140 = width(100) + box_shadow_offset_x(40)
334 // 110 = height(90) + box_shadow_offset_y(20) 320 // 110 = height(90) + box_shadow_offset_y(20)
335 EXPECT_EQ(LayoutRect(0, 0, 140, 110), targetVisualRect); 321 EXPECT_EQ(LayoutRect(0, 0, 140, 110), targetLocalVisualRect);
336 LayoutRect rect = targetVisualRect; 322 LayoutRect rect = targetLocalVisualRect;
337 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(target, rect)); 323 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(target, rect));
338 EXPECT_EQ(LayoutRect(0, 0, 140, 110), rect); 324 EXPECT_EQ(LayoutRect(0, 0, 140, 110), rect);
339 325
340 rect = targetVisualRect; 326 rect = targetLocalVisualRect;
341 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(container, rect)); 327 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(container, rect));
342 rect.move(-container->scrolledContentOffset()); 328 rect.move(-container->scrolledContentOffset());
343 // 2 = target_x(0) + container_border_left(10) - scroll_left(8) 329 // 2 = target_x(0) + container_border_left(10) - scroll_left(8)
344 // 3 = target_y(0) + container_border_top(10) - scroll_top(7) 330 // 3 = target_y(0) + container_border_top(10) - scroll_top(7)
345 // Rect is not clipped by container's overflow clip because of 331 // Rect is not clipped by container's overflow clip because of
346 // overflow:scroll. 332 // overflow:scroll.
347 EXPECT_EQ(LayoutRect(2, 3, 140, 110), rect); 333 EXPECT_EQ(LayoutRect(2, 3, 140, 110), rect);
348 334
349 rect = targetVisualRect; 335 rect = targetLocalVisualRect;
350 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(&layoutView(), rect)); 336 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(&layoutView(), rect));
351 // (2, 3, 140, 100) is first clipped by container's overflow clip, to 337 // (2, 3, 140, 100) is first clipped by container's overflow clip, to
352 // (10, 10, 50, 80), then is by added container's offset in LayoutView 338 // (10, 10, 50, 80), then is by added container's offset in LayoutView
353 // (111, 222). 339 // (111, 222).
354 EXPECT_EQ(LayoutRect(232, 121, 50, 80), rect); 340 EXPECT_EQ(LayoutRect(232, 121, 50, 80), rect);
355 checkPaintInvalidationStateRectMapping(rect, targetVisualRect, *target, 341 EXPECT_EQ(rect, target->visualRect());
356 layoutView(), layoutView());
357 342
358 LayoutRect containerVisualRect = container->localVisualRect(); 343 LayoutRect containerLocalVisualRect = container->localVisualRect();
359 // Because container has overflow clip, its visual overflow doesn't include 344 // Because container has overflow clip, its visual overflow doesn't include
360 // overflow from children. 345 // overflow from children.
361 // 70 = width(50) + border_left_width(10) + border_right_width(10) 346 // 70 = width(50) + border_left_width(10) + border_right_width(10)
362 // 100 = height(80) + border_top_width(10) + border_bottom_width(10) 347 // 100 = height(80) + border_top_width(10) + border_bottom_width(10)
363 EXPECT_EQ(LayoutRect(0, 0, 70, 100), containerVisualRect); 348 EXPECT_EQ(LayoutRect(0, 0, 70, 100), containerLocalVisualRect);
364 rect = containerVisualRect; 349 rect = containerLocalVisualRect;
365 EXPECT_TRUE(container->mapToVisualRectInAncestorSpace(container, rect)); 350 EXPECT_TRUE(container->mapToVisualRectInAncestorSpace(container, rect));
366 // Container should not apply overflow clip on its own overflow rect. 351 // Container should not apply overflow clip on its own overflow rect.
367 EXPECT_EQ(LayoutRect(0, 0, 70, 100), rect); 352 EXPECT_EQ(LayoutRect(0, 0, 70, 100), rect);
368 353
369 rect = containerVisualRect; 354 rect = containerLocalVisualRect;
370 EXPECT_TRUE(container->mapToVisualRectInAncestorSpace(&layoutView(), rect)); 355 EXPECT_TRUE(container->mapToVisualRectInAncestorSpace(&layoutView(), rect));
371 EXPECT_EQ(LayoutRect(222, 111, 70, 100), rect); 356 EXPECT_EQ(LayoutRect(222, 111, 70, 100), rect);
372 checkPaintInvalidationStateRectMapping(rect, containerVisualRect, *container, 357 EXPECT_EQ(rect, container->visualRect());
373 layoutView(), layoutView());
374 } 358 }
375 359
376 TEST_F(VisualRectMappingTest, ContainerFlippedWritingModeAndOverflowScroll) { 360 TEST_F(VisualRectMappingTest, ContainerFlippedWritingModeAndOverflowScroll) {
377 setBodyInnerHTML( 361 setBodyInnerHTML(
378 "<div id='container' style='writing-mode: vertical-rl; position: " 362 "<div id='container' style='writing-mode: vertical-rl;"
379 "absolute; top: 111px; left: 222px;" 363 " position: absolute; top: 111px; left: 222px; border: solid red;"
380 " border: solid red; border-width: 10px 20px 30px 40px;" 364 " border-width: 10px 20px 30px 40px; overflow: scroll; width: 50px;"
381 " overflow: scroll; width: 50px; height: 80px'>" 365 " height: 80px'>"
382 " <div id='target' style='box-shadow: 40px 20px black; width: 100px; " 366 " <div id='target' style='box-shadow: 40px 20px black; width: 100px;"
383 "height: 90px'></div>" 367 " height: 90px'></div>"
384 " <div style='width: 100px; height: 100px'></div>" 368 " <div style='width: 100px; height: 100px'></div>"
385 "</div>"); 369 "</div>");
386 370
387 LayoutBlock* container = 371 LayoutBlock* container =
388 toLayoutBlock(getLayoutObjectByElementId("container")); 372 toLayoutBlock(getLayoutObjectByElementId("container"));
389 EXPECT_EQ(LayoutUnit(), container->scrollTop()); 373 EXPECT_EQ(LayoutUnit(), container->scrollTop());
390 // The initial scroll offset is to the left-most because of flipped blocks 374 // The initial scroll offset is to the left-most because of flipped blocks
391 // writing mode. 375 // writing mode.
392 // 150 = total_layout_overflow(100 + 100) - width(50) 376 // 150 = total_layout_overflow(100 + 100) - width(50)
393 EXPECT_EQ(LayoutUnit(150), container->scrollLeft()); 377 EXPECT_EQ(LayoutUnit(150), container->scrollLeft());
394 container->setScrollTop(LayoutUnit(7)); 378 container->setScrollTop(LayoutUnit(7));
395 container->setScrollLeft( 379 container->setScrollLeft(
396 LayoutUnit(142)); // Scroll to the right by 8 pixels. 380 LayoutUnit(142)); // Scroll to the right by 8 pixels.
397 document().view()->updateAllLifecyclePhases(); 381 document().view()->updateAllLifecyclePhases();
398 382
399 LayoutBlock* target = toLayoutBlock(getLayoutObjectByElementId("target")); 383 LayoutBlock* target = toLayoutBlock(getLayoutObjectByElementId("target"));
400 LayoutRect targetVisualRect = target->localVisualRect(); 384 LayoutRect targetLocalVisualRect = target->localVisualRect();
401 // -40 = -box_shadow_offset_x(40) (with target's top-right corner as the 385 // -40 = -box_shadow_offset_x(40) (with target's top-right corner as the
402 // origin) 386 // origin)
403 // 140 = width(100) + box_shadow_offset_x(40) 387 // 140 = width(100) + box_shadow_offset_x(40)
404 // 110 = height(90) + box_shadow_offset_y(20) 388 // 110 = height(90) + box_shadow_offset_y(20)
405 EXPECT_EQ(LayoutRect(-40, 0, 140, 110), targetVisualRect); 389 EXPECT_EQ(LayoutRect(-40, 0, 140, 110), targetLocalVisualRect);
406 390
407 LayoutRect rect = targetVisualRect; 391 LayoutRect rect = targetLocalVisualRect;
408 target->flipForWritingMode(rect); 392 target->flipForWritingMode(rect);
409 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(target, rect)); 393 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(target, rect));
410 // This rect is in physical coordinates of target. 394 // This rect is in physical coordinates of target.
411 EXPECT_EQ(LayoutRect(0, 0, 140, 110), rect); 395 EXPECT_EQ(LayoutRect(0, 0, 140, 110), rect);
412 396
413 rect = targetVisualRect; 397 rect = targetLocalVisualRect;
414 target->flipForWritingMode(rect); 398 target->flipForWritingMode(rect);
415 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(container, rect)); 399 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(container, rect));
416 rect.move(-container->scrolledContentOffset()); 400 rect.move(-container->scrolledContentOffset());
417 // -2 = target_physical_x(100) + container_border_left(40) - scroll_left(142) 401 // -2 = target_physical_x(100) + container_border_left(40) - scroll_left(142)
418 // 3 = target_y(0) + container_border_top(10) - scroll_top(7) 402 // 3 = target_y(0) + container_border_top(10) - scroll_top(7)
419 // Rect is clipped by container's overflow clip because of overflow:scroll. 403 // Rect is clipped by container's overflow clip because of overflow:scroll.
420 EXPECT_EQ(LayoutRect(-2, 3, 140, 110), rect); 404 EXPECT_EQ(LayoutRect(-2, 3, 140, 110), rect);
421 405
422 rect = targetVisualRect; 406 rect = targetLocalVisualRect;
423 target->flipForWritingMode(rect); 407 target->flipForWritingMode(rect);
424 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(&layoutView(), rect)); 408 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(&layoutView(), rect));
425 // (-2, 3, 140, 100) is first clipped by container's overflow clip, to 409 // (-2, 3, 140, 100) is first clipped by container's overflow clip, to
426 // (40, 10, 50, 80), then is added by container's offset in LayoutView 410 // (40, 10, 50, 80), then is added by container's offset in LayoutView
427 // (111, 222). 411 // (111, 222).
428 // TODO(crbug.com/600039): rect.x() should be 262 (left + border-left), but is 412 // TODO(crbug.com/600039): rect.x() should be 262 (left + border-left), but is
429 // offset 413 // offset
430 // by extra horizontal border-widths because of layout error. 414 // by extra horizontal border-widths because of layout error.
431 EXPECT_EQ(LayoutRect(322, 121, 50, 80), rect); 415 EXPECT_EQ(LayoutRect(322, 121, 50, 80), rect);
432 checkPaintInvalidationStateRectMapping(rect, targetVisualRect, *target, 416 EXPECT_EQ(rect, target->visualRect());
433 layoutView(), layoutView());
434 417
435 LayoutRect containerVisualRect = container->localVisualRect(); 418 LayoutRect containerLocalVisualRect = container->localVisualRect();
436 // Because container has overflow clip, its visual overflow doesn't include 419 // Because container has overflow clip, its visual overflow doesn't include
437 // overflow from children. 420 // overflow from children.
438 // 110 = width(50) + border_left_width(40) + border_right_width(20) 421 // 110 = width(50) + border_left_width(40) + border_right_width(20)
439 // 120 = height(80) + border_top_width(10) + border_bottom_width(30) 422 // 120 = height(80) + border_top_width(10) + border_bottom_width(30)
440 EXPECT_EQ(LayoutRect(0, 0, 110, 120), containerVisualRect); 423 EXPECT_EQ(LayoutRect(0, 0, 110, 120), containerLocalVisualRect);
441 424
442 rect = containerVisualRect; 425 rect = containerLocalVisualRect;
443 container->flipForWritingMode(rect); 426 container->flipForWritingMode(rect);
444 EXPECT_TRUE(container->mapToVisualRectInAncestorSpace(container, rect)); 427 EXPECT_TRUE(container->mapToVisualRectInAncestorSpace(container, rect));
445 EXPECT_EQ(LayoutRect(0, 0, 110, 120), rect); 428 EXPECT_EQ(LayoutRect(0, 0, 110, 120), rect);
446 429
447 rect = containerVisualRect; 430 rect = containerLocalVisualRect;
448 container->flipForWritingMode(rect); 431 container->flipForWritingMode(rect);
449 EXPECT_TRUE(container->mapToVisualRectInAncestorSpace(&layoutView(), rect)); 432 EXPECT_TRUE(container->mapToVisualRectInAncestorSpace(&layoutView(), rect));
450 // TODO(crbug.com/600039): rect.x() should be 222 (left), but is offset by 433 // TODO(crbug.com/600039): rect.x() should be 222 (left), but is offset by
451 // extra horizontal 434 // extra horizontal
452 // border-widths because of layout error. 435 // border-widths because of layout error.
453 EXPECT_EQ(LayoutRect(282, 111, 110, 120), rect); 436 EXPECT_EQ(LayoutRect(282, 111, 110, 120), rect);
454 checkPaintInvalidationStateRectMapping(rect, containerVisualRect, *container, 437 EXPECT_EQ(rect, container->visualRect());
455 layoutView(), layoutView());
456 } 438 }
457 439
458 TEST_F(VisualRectMappingTest, ContainerOverflowHidden) { 440 TEST_F(VisualRectMappingTest, ContainerOverflowHidden) {
459 setBodyInnerHTML( 441 setBodyInnerHTML(
460 "<div id='container' style='position: absolute; top: 111px; left: 222px;" 442 "<div id='container' style='position: absolute; top: 111px; left: 222px;"
461 " border: 10px solid red; overflow: hidden; width: 50px; height: " 443 " border: 10px solid red; overflow: hidden; width: 50px;"
462 "80px;'>" 444 " height: 80px;'>"
463 " <div id='target' style='box-shadow: 40px 20px black; width: 100px; " 445 " <div id='target' style='box-shadow: 40px 20px black; width: 100px;"
464 "height: 90px'></div>" 446 " height: 90px'></div>"
465 "</div>"); 447 "</div>");
466 448
467 LayoutBlock* container = 449 LayoutBlock* container =
468 toLayoutBlock(getLayoutObjectByElementId("container")); 450 toLayoutBlock(getLayoutObjectByElementId("container"));
469 EXPECT_EQ(LayoutUnit(), container->scrollTop()); 451 EXPECT_EQ(LayoutUnit(), container->scrollTop());
470 EXPECT_EQ(LayoutUnit(), container->scrollLeft()); 452 EXPECT_EQ(LayoutUnit(), container->scrollLeft());
471 container->setScrollTop(LayoutUnit(27)); 453 container->setScrollTop(LayoutUnit(27));
472 container->setScrollLeft(LayoutUnit(28)); 454 container->setScrollLeft(LayoutUnit(28));
473 document().view()->updateAllLifecyclePhases(); 455 document().view()->updateAllLifecyclePhases();
474 456
475 LayoutBlock* target = toLayoutBlock(getLayoutObjectByElementId("target")); 457 LayoutBlock* target = toLayoutBlock(getLayoutObjectByElementId("target"));
476 LayoutRect targetVisualRect = target->localVisualRect(); 458 LayoutRect targetLocalVisualRect = target->localVisualRect();
477 // 140 = width(100) + box_shadow_offset_x(40) 459 // 140 = width(100) + box_shadow_offset_x(40)
478 // 110 = height(90) + box_shadow_offset_y(20) 460 // 110 = height(90) + box_shadow_offset_y(20)
479 EXPECT_EQ(LayoutRect(0, 0, 140, 110), targetVisualRect); 461 EXPECT_EQ(LayoutRect(0, 0, 140, 110), targetLocalVisualRect);
480 LayoutRect rect = targetVisualRect; 462 LayoutRect rect = targetLocalVisualRect;
481 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(target, rect)); 463 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(target, rect));
482 EXPECT_EQ(LayoutRect(0, 0, 140, 110), rect); 464 EXPECT_EQ(LayoutRect(0, 0, 140, 110), rect);
483 465
484 rect = targetVisualRect; 466 rect = targetLocalVisualRect;
485 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(container, rect)); 467 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(container, rect));
486 // Rect is not clipped by container's overflow clip. 468 // Rect is not clipped by container's overflow clip.
487 EXPECT_EQ(LayoutRect(10, 10, 140, 110), rect); 469 EXPECT_EQ(LayoutRect(10, 10, 140, 110), rect);
488 } 470 }
489 471
490 TEST_F(VisualRectMappingTest, ContainerFlippedWritingModeAndOverflowHidden) { 472 TEST_F(VisualRectMappingTest, ContainerFlippedWritingModeAndOverflowHidden) {
491 setBodyInnerHTML( 473 setBodyInnerHTML(
492 "<div id='container' style='writing-mode: vertical-rl; position: " 474 "<div id='container' style='writing-mode: vertical-rl; "
493 "absolute; top: 111px; left: 222px;" 475 " position: absolute; top: 111px; left: 222px; border: solid red; "
494 " border: solid red; border-width: 10px 20px 30px 40px;" 476 " border-width: 10px 20px 30px 40px; overflow: hidden; width: 50px; "
495 " overflow: hidden; width: 50px; height: 80px'>" 477 " height: 80px'>"
496 " <div id='target' style='box-shadow: 40px 20px black; width: 100px; " 478 " <div id='target' style='box-shadow: 40px 20px black; width: 100px; "
497 "height: 90px'></div>" 479 " height: 90px'></div>"
498 " <div style='width: 100px; height: 100px'></div>" 480 " <div style='width: 100px; height: 100px'></div>"
499 "</div>"); 481 "</div>");
500 482
501 LayoutBlock* container = 483 LayoutBlock* container =
502 toLayoutBlock(getLayoutObjectByElementId("container")); 484 toLayoutBlock(getLayoutObjectByElementId("container"));
503 EXPECT_EQ(LayoutUnit(), container->scrollTop()); 485 EXPECT_EQ(LayoutUnit(), container->scrollTop());
504 // The initial scroll offset is to the left-most because of flipped blocks 486 // The initial scroll offset is to the left-most because of flipped blocks
505 // writing mode. 487 // writing mode.
506 // 150 = total_layout_overflow(100 + 100) - width(50) 488 // 150 = total_layout_overflow(100 + 100) - width(50)
507 EXPECT_EQ(LayoutUnit(150), container->scrollLeft()); 489 EXPECT_EQ(LayoutUnit(150), container->scrollLeft());
508 container->setScrollTop(LayoutUnit(7)); 490 container->setScrollTop(LayoutUnit(7));
509 container->setScrollLeft(LayoutUnit(82)); // Scroll to the right by 8 pixels. 491 container->setScrollLeft(LayoutUnit(82)); // Scroll to the right by 8 pixels.
510 document().view()->updateAllLifecyclePhases(); 492 document().view()->updateAllLifecyclePhases();
511 493
512 LayoutBlock* target = toLayoutBlock(getLayoutObjectByElementId("target")); 494 LayoutBlock* target = toLayoutBlock(getLayoutObjectByElementId("target"));
513 LayoutRect targetVisualRect = target->localVisualRect(); 495 LayoutRect targetLocalVisualRect = target->localVisualRect();
514 // -40 = -box_shadow_offset_x(40) (with target's top-right corner as the 496 // -40 = -box_shadow_offset_x(40) (with target's top-right corner as the
515 // origin) 497 // origin)
516 // 140 = width(100) + box_shadow_offset_x(40) 498 // 140 = width(100) + box_shadow_offset_x(40)
517 // 110 = height(90) + box_shadow_offset_y(20) 499 // 110 = height(90) + box_shadow_offset_y(20)
518 EXPECT_EQ(LayoutRect(-40, 0, 140, 110), targetVisualRect); 500 EXPECT_EQ(LayoutRect(-40, 0, 140, 110), targetLocalVisualRect);
519 501
520 LayoutRect rect = targetVisualRect; 502 LayoutRect rect = targetLocalVisualRect;
521 target->flipForWritingMode(rect); 503 target->flipForWritingMode(rect);
522 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(target, rect)); 504 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(target, rect));
523 // This rect is in physical coordinates of target. 505 // This rect is in physical coordinates of target.
524 EXPECT_EQ(LayoutRect(0, 0, 140, 110), rect); 506 EXPECT_EQ(LayoutRect(0, 0, 140, 110), rect);
525 507
526 rect = targetVisualRect; 508 rect = targetLocalVisualRect;
527 target->flipForWritingMode(rect); 509 target->flipForWritingMode(rect);
528 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(container, rect)); 510 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(container, rect));
529 // 58 = target_physical_x(100) + container_border_left(40) - scroll_left(58) 511 // 58 = target_physical_x(100) + container_border_left(40) - scroll_left(58)
530 EXPECT_EQ(LayoutRect(-10, 10, 140, 110), rect); 512 EXPECT_EQ(LayoutRect(-10, 10, 140, 110), rect);
531 } 513 }
532 514
533 TEST_F(VisualRectMappingTest, ContainerAndTargetDifferentFlippedWritingMode) { 515 TEST_F(VisualRectMappingTest, ContainerAndTargetDifferentFlippedWritingMode) {
534 setBodyInnerHTML( 516 setBodyInnerHTML(
535 "<div id='container' style='writing-mode: vertical-rl; position: " 517 "<div id='container' style='writing-mode: vertical-rl;"
536 "absolute; top: 111px; left: 222px;" 518 " position: absolute; top: 111px; left: 222px; border: solid red;"
537 " border: solid red; border-width: 10px 20px 30px 40px;" 519 " border-width: 10px 20px 30px 40px; overflow: scroll; width: 50px;"
538 " overflow: scroll; width: 50px; height: 80px'>" 520 " height: 80px'>"
539 " <div id='target' style='writing-mode: vertical-lr; box-shadow: 40px " 521 " <div id='target' style='writing-mode: vertical-lr; width: 100px;"
540 "20px black; width: 100px; height: 90px'></div>" 522 " height: 90px; box-shadow: 40px 20px black'></div>"
541 " <div style='width: 100px; height: 100px'></div>" 523 " <div style='width: 100px; height: 100px'></div>"
542 "</div>"); 524 "</div>");
543 525
544 LayoutBlock* container = 526 LayoutBlock* container =
545 toLayoutBlock(getLayoutObjectByElementId("container")); 527 toLayoutBlock(getLayoutObjectByElementId("container"));
546 EXPECT_EQ(LayoutUnit(), container->scrollTop()); 528 EXPECT_EQ(LayoutUnit(), container->scrollTop());
547 // The initial scroll offset is to the left-most because of flipped blocks 529 // The initial scroll offset is to the left-most because of flipped blocks
548 // writing mode. 530 // writing mode.
549 // 150 = total_layout_overflow(100 + 100) - width(50) 531 // 150 = total_layout_overflow(100 + 100) - width(50)
550 EXPECT_EQ(LayoutUnit(150), container->scrollLeft()); 532 EXPECT_EQ(LayoutUnit(150), container->scrollLeft());
551 container->setScrollTop(LayoutUnit(7)); 533 container->setScrollTop(LayoutUnit(7));
552 container->setScrollLeft( 534 container->setScrollLeft(
553 LayoutUnit(142)); // Scroll to the right by 8 pixels. 535 LayoutUnit(142)); // Scroll to the right by 8 pixels.
554 document().view()->updateAllLifecyclePhases(); 536 document().view()->updateAllLifecyclePhases();
555 537
556 LayoutBlock* target = toLayoutBlock(getLayoutObjectByElementId("target")); 538 LayoutBlock* target = toLayoutBlock(getLayoutObjectByElementId("target"));
557 LayoutRect targetVisualRect = target->localVisualRect(); 539 LayoutRect targetLocalVisualRect = target->localVisualRect();
558 // 140 = width(100) + box_shadow_offset_x(40) 540 // 140 = width(100) + box_shadow_offset_x(40)
559 // 110 = height(90) + box_shadow_offset_y(20) 541 // 110 = height(90) + box_shadow_offset_y(20)
560 EXPECT_EQ(LayoutRect(0, 0, 140, 110), targetVisualRect); 542 EXPECT_EQ(LayoutRect(0, 0, 140, 110), targetLocalVisualRect);
561 543
562 LayoutRect rect = targetVisualRect; 544 LayoutRect rect = targetLocalVisualRect;
563 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(target, rect)); 545 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(target, rect));
564 // This rect is in physical coordinates of target. 546 // This rect is in physical coordinates of target.
565 EXPECT_EQ(LayoutRect(0, 0, 140, 110), rect); 547 EXPECT_EQ(LayoutRect(0, 0, 140, 110), rect);
566 548
567 rect = targetVisualRect; 549 rect = targetLocalVisualRect;
568 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(container, rect)); 550 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(container, rect));
569 rect.move(-container->scrolledContentOffset()); 551 rect.move(-container->scrolledContentOffset());
570 // -2 = target_physical_x(100) + container_border_left(40) - scroll_left(142) 552 // -2 = target_physical_x(100) + container_border_left(40) - scroll_left(142)
571 // 3 = target_y(0) + container_border_top(10) - scroll_top(7) 553 // 3 = target_y(0) + container_border_top(10) - scroll_top(7)
572 // Rect is not clipped by container's overflow clip. 554 // Rect is not clipped by container's overflow clip.
573 EXPECT_EQ(LayoutRect(-2, 3, 140, 110), rect); 555 EXPECT_EQ(LayoutRect(-2, 3, 140, 110), rect);
574 } 556 }
575 557
576 TEST_F(VisualRectMappingTest, 558 TEST_F(VisualRectMappingTest,
577 DifferentPaintInvalidaitionContainerForAbsolutePosition) { 559 DifferentPaintInvalidaitionContainerForAbsolutePosition) {
578 enableCompositing(); 560 enableCompositing();
579 document().frame()->settings()->setPreferCompositingToLCDTextEnabled(true); 561 document().frame()->settings()->setPreferCompositingToLCDTextEnabled(true);
580 562
581 setBodyInnerHTML( 563 setBodyInnerHTML(
582 "<div id='stacking-context' style='opacity: 0.9; background: blue; " 564 "<div id='stacking-context' style='opacity: 0.9; background: blue;"
583 "will-change: transform'>" 565 " will-change: transform'>"
584 " <div id='scroller' style='overflow: scroll; width: 80px; height: " 566 " <div id='scroller' style='overflow: scroll; width: 80px;"
585 "80px'>" 567 " height: 80px'>"
586 " <div id='absolute' style='position: absolute; top: 111px; left: " 568 " <div id='absolute' style='position: absolute; top: 111px;"
587 "222px; width: 50px; height: 50px; background: green'></div>" 569 " left: 222px; width: 50px; height: 50px; background: green'>"
588 " <div id='normal-flow' style='width: 2000px; height: 2000px; "
589 "background: yellow'></div>"
590 " </div>" 570 " </div>"
571 " <div id='normal-flow' style='width: 2000px; height: 2000px;"
572 " background: yellow'></div>"
573 " </div>"
591 "</div>"); 574 "</div>");
592 575
593 LayoutBlock* scroller = toLayoutBlock(getLayoutObjectByElementId("scroller")); 576 LayoutBlock* scroller = toLayoutBlock(getLayoutObjectByElementId("scroller"));
594 scroller->setScrollTop(LayoutUnit(77)); 577 scroller->setScrollTop(LayoutUnit(77));
595 scroller->setScrollLeft(LayoutUnit(88)); 578 scroller->setScrollLeft(LayoutUnit(88));
596 document().view()->updateAllLifecyclePhases(); 579 document().view()->updateAllLifecyclePhases();
597 580
598 LayoutBlock* normalFlow = 581 LayoutBlock* normalFlow =
599 toLayoutBlock(getLayoutObjectByElementId("normal-flow")); 582 toLayoutBlock(getLayoutObjectByElementId("normal-flow"));
600 EXPECT_EQ(scroller, &normalFlow->containerForPaintInvalidation()); 583 EXPECT_EQ(scroller, &normalFlow->containerForPaintInvalidation());
601 584
602 LayoutRect normalFlowVisualRect = normalFlow->localVisualRect(); 585 LayoutRect normalFlowVisualRect = normalFlow->localVisualRect();
603 EXPECT_EQ(LayoutRect(0, 0, 2000, 2000), normalFlowVisualRect); 586 EXPECT_EQ(LayoutRect(0, 0, 2000, 2000), normalFlowVisualRect);
604 LayoutRect rect = normalFlowVisualRect; 587 LayoutRect rect = normalFlowVisualRect;
605 EXPECT_TRUE(normalFlow->mapToVisualRectInAncestorSpace(scroller, rect)); 588 EXPECT_TRUE(normalFlow->mapToVisualRectInAncestorSpace(scroller, rect));
606 EXPECT_EQ(LayoutRect(0, 0, 2000, 2000), rect); 589 EXPECT_EQ(LayoutRect(0, 0, 2000, 2000), rect);
607 checkPaintInvalidationStateRectMapping(rect, normalFlowVisualRect, 590 EXPECT_EQ(rect, normalFlow->visualRect());
608 *normalFlow, layoutView(), *scroller);
609 591
610 LayoutBlock* stackingContext = 592 LayoutBlock* stackingContext =
611 toLayoutBlock(getLayoutObjectByElementId("stacking-context")); 593 toLayoutBlock(getLayoutObjectByElementId("stacking-context"));
612 LayoutBlock* absolute = toLayoutBlock(getLayoutObjectByElementId("absolute")); 594 LayoutBlock* absolute = toLayoutBlock(getLayoutObjectByElementId("absolute"));
613 EXPECT_EQ(stackingContext, &absolute->containerForPaintInvalidation()); 595 EXPECT_EQ(stackingContext, &absolute->containerForPaintInvalidation());
614 EXPECT_EQ(stackingContext, absolute->container()); 596 EXPECT_EQ(stackingContext, absolute->container());
615 597
616 LayoutRect absoluteVisualRect = absolute->localVisualRect(); 598 LayoutRect absoluteVisualRect = absolute->localVisualRect();
617 EXPECT_EQ(LayoutRect(0, 0, 50, 50), absoluteVisualRect); 599 EXPECT_EQ(LayoutRect(0, 0, 50, 50), absoluteVisualRect);
618 rect = absoluteVisualRect; 600 rect = absoluteVisualRect;
619 EXPECT_TRUE(absolute->mapToVisualRectInAncestorSpace(stackingContext, rect)); 601 EXPECT_TRUE(absolute->mapToVisualRectInAncestorSpace(stackingContext, rect));
620 EXPECT_EQ(LayoutRect(222, 111, 50, 50), rect); 602 EXPECT_EQ(LayoutRect(222, 111, 50, 50), rect);
621 checkPaintInvalidationStateRectMapping(rect, absoluteVisualRect, *absolute, 603 EXPECT_EQ(rect, absolute->visualRect());
622 layoutView(), *stackingContext);
623 } 604 }
624 605
625 TEST_F(VisualRectMappingTest, 606 TEST_F(VisualRectMappingTest,
626 ContainerOfAbsoluteAbovePaintInvalidationContainer) { 607 ContainerOfAbsoluteAbovePaintInvalidationContainer) {
627 enableCompositing(); 608 enableCompositing();
628 document().frame()->settings()->setPreferCompositingToLCDTextEnabled(true); 609 document().frame()->settings()->setPreferCompositingToLCDTextEnabled(true);
629 610
630 setBodyInnerHTML( 611 setBodyInnerHTML(
631 "<div id='container' style='position: absolute; top: 88px; left: 99px'>" 612 "<div id='container' style='position: absolute; top: 88px; left: 99px'>"
632 " <div style='height: 222px'></div>" 613 " <div style='height: 222px'></div>"
633 // This div makes stacking-context composited. 614 // This div makes stacking-context composited.
634 " <div style='position: absolute; width: 1px; height: 1px; " 615 " <div style='position: absolute; width: 1px; height: 1px; "
635 "background:yellow; will-change: transform'></div>" 616 " background:yellow; will-change: transform'></div>"
636 // This stacking context is paintInvalidationContainer of the absolute 617 // This stacking context is paintInvalidationContainer of the absolute
637 // child, but not a container of it. 618 // child, but not a container of it.
638 " <div id='stacking-context' style='opacity: 0.9'>" 619 " <div id='stacking-context' style='opacity: 0.9'>"
639 " <div id='absolute' style='position: absolute; top: 50px; left: " 620 " <div id='absolute' style='position: absolute; top: 50px; left: 50px;"
640 "50px; width: 50px; height: 50px; background: green'></div>" 621 " width: 50px; height: 50px; background: green'></div>"
641 " </div>" 622 " </div>"
642 "</div>"); 623 "</div>");
643 624
644 LayoutBlock* stackingContext = 625 LayoutBlock* stackingContext =
645 toLayoutBlock(getLayoutObjectByElementId("stacking-context")); 626 toLayoutBlock(getLayoutObjectByElementId("stacking-context"));
646 LayoutBlock* absolute = toLayoutBlock(getLayoutObjectByElementId("absolute")); 627 LayoutBlock* absolute = toLayoutBlock(getLayoutObjectByElementId("absolute"));
647 LayoutBlock* container = 628 LayoutBlock* container =
648 toLayoutBlock(getLayoutObjectByElementId("container")); 629 toLayoutBlock(getLayoutObjectByElementId("container"));
649 EXPECT_EQ(stackingContext, &absolute->containerForPaintInvalidation()); 630 EXPECT_EQ(stackingContext, &absolute->containerForPaintInvalidation());
650 EXPECT_EQ(container, absolute->container()); 631 EXPECT_EQ(container, absolute->container());
651 632
652 LayoutRect absoluteVisualRect = absolute->localVisualRect(); 633 LayoutRect absoluteVisualRect = absolute->localVisualRect();
653 EXPECT_EQ(LayoutRect(0, 0, 50, 50), absoluteVisualRect); 634 EXPECT_EQ(LayoutRect(0, 0, 50, 50), absoluteVisualRect);
654 LayoutRect rect = absoluteVisualRect; 635 LayoutRect rect = absoluteVisualRect;
655 EXPECT_TRUE(absolute->mapToVisualRectInAncestorSpace(stackingContext, rect)); 636 EXPECT_TRUE(absolute->mapToVisualRectInAncestorSpace(stackingContext, rect));
656 // -172 = top(50) - y_offset_of_stacking_context(222) 637 // -172 = top(50) - y_offset_of_stacking_context(222)
657 EXPECT_EQ(LayoutRect(50, -172, 50, 50), rect); 638 EXPECT_EQ(LayoutRect(50, -172, 50, 50), rect);
658 checkPaintInvalidationStateRectMapping(rect, absoluteVisualRect, *absolute, 639 // Use checkPaintInvalidationVisualRect to deals with layer squashing.
659 layoutView(), *stackingContext); 640 checkPaintInvalidationVisualRect(*absolute);
660 } 641 }
661 642
662 TEST_F(VisualRectMappingTest, CSSClip) { 643 TEST_F(VisualRectMappingTest, CSSClip) {
663 setBodyInnerHTML( 644 setBodyInnerHTML(
664 "<div id='container' style='position: absolute; top: 0px; left: 0px; " 645 "<div id='container' style='position: absolute; top: 0px; left: 0px; "
665 "clip: rect(0px, 200px, 200px, 0px)'>" 646 " clip: rect(0px, 200px, 200px, 0px)'>"
666 " <div id='target' style='width: 400px; height: 400px'></div>" 647 " <div id='target' style='width: 400px; height: 400px'></div>"
667 " </div>"
668 "</div>"); 648 "</div>");
669 649
670 LayoutBox* target = toLayoutBox(getLayoutObjectByElementId("target")); 650 LayoutBox* target = toLayoutBox(getLayoutObjectByElementId("target"));
671 651
672 LayoutRect targetVisualRect = target->localVisualRect(); 652 LayoutRect targetLocalVisualRect = target->localVisualRect();
673 EXPECT_EQ(LayoutRect(0, 0, 400, 400), targetVisualRect); 653 EXPECT_EQ(LayoutRect(0, 0, 400, 400), targetLocalVisualRect);
674 LayoutRect rect = targetVisualRect; 654 LayoutRect rect = targetLocalVisualRect;
675 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(&layoutView(), rect)); 655 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(&layoutView(), rect));
676 EXPECT_EQ(LayoutRect(0, 0, 200, 200), rect); 656 EXPECT_EQ(LayoutRect(0, 0, 200, 200), rect);
677 checkPaintInvalidationStateRectMapping(rect, targetVisualRect, *target, 657 EXPECT_EQ(rect, target->visualRect());
678 layoutView(), layoutView());
679 } 658 }
680 659
681 TEST_F(VisualRectMappingTest, ContainPaint) { 660 TEST_F(VisualRectMappingTest, ContainPaint) {
682 setBodyInnerHTML( 661 setBodyInnerHTML(
683 "<div id='container' style='position: absolute; top: 0px; left: 0px; " 662 "<div id='container' style='position: absolute; top: 0px; left: 0px; "
684 "width: 200px; height: 200px; contain: paint'>" 663 " width: 200px; height: 200px; contain: paint'>"
685 " <div id='target' style='width: 400px; height: 400px'></div>" 664 " <div id='target' style='width: 400px; height: 400px'></div>"
686 " </div>"
687 "</div>"); 665 "</div>");
688 666
689 LayoutBox* target = toLayoutBox(getLayoutObjectByElementId("target")); 667 LayoutBox* target = toLayoutBox(getLayoutObjectByElementId("target"));
690 668
691 LayoutRect targetVisualRect = target->localVisualRect(); 669 LayoutRect targetLocalVisualRect = target->localVisualRect();
692 EXPECT_EQ(LayoutRect(0, 0, 400, 400), targetVisualRect); 670 EXPECT_EQ(LayoutRect(0, 0, 400, 400), targetLocalVisualRect);
693 LayoutRect rect = targetVisualRect; 671 LayoutRect rect = targetLocalVisualRect;
694 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(&layoutView(), rect)); 672 EXPECT_TRUE(target->mapToVisualRectInAncestorSpace(&layoutView(), rect));
695 EXPECT_EQ(LayoutRect(0, 0, 200, 200), rect); 673 EXPECT_EQ(LayoutRect(0, 0, 200, 200), rect);
696 checkPaintInvalidationStateRectMapping(rect, targetVisualRect, *target, 674 EXPECT_EQ(rect, target->visualRect());
697 layoutView(), layoutView());
698 } 675 }
699 676
700 } // namespace blink 677 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/LayoutTests/TestExpectations ('k') | third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698