| OLD | NEW |
| 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/ScrollAnchor.h" | 5 #include "core/layout/ScrollAnchor.h" |
| 6 | 6 |
| 7 #include "core/layout/LayoutBox.h" | 7 #include "core/layout/LayoutBox.h" |
| 8 #include "core/layout/LayoutTestHelper.h" | 8 #include "core/layout/LayoutTestHelper.h" |
| 9 #include "core/paint/PaintLayerScrollableArea.h" | 9 #include "core/paint/PaintLayerScrollableArea.h" |
| 10 #include "platform/testing/HistogramTester.h" | 10 #include "platform/testing/HistogramTester.h" |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 setHeight(block1, 200); | 152 setHeight(block1, 200); |
| 153 EXPECT_EQ(250, scroller->scrollPosition().y()); | 153 EXPECT_EQ(250, scroller->scrollPosition().y()); |
| 154 EXPECT_EQ(block2->layoutObject(), scrollAnchor(scroller).anchorObject()); | 154 EXPECT_EQ(block2->layoutObject(), scrollAnchor(scroller).anchorObject()); |
| 155 | 155 |
| 156 // Test that the anchor object can be destroyed without affecting the scroll
position. | 156 // Test that the anchor object can be destroyed without affecting the scroll
position. |
| 157 block2->remove(); | 157 block2->remove(); |
| 158 update(); | 158 update(); |
| 159 EXPECT_EQ(250, scroller->scrollPosition().y()); | 159 EXPECT_EQ(250, scroller->scrollPosition().y()); |
| 160 } | 160 } |
| 161 | 161 |
| 162 TEST_F(ScrollAnchorTest, ExcludeAnonymousCandidates) |
| 163 { |
| 164 setBodyInnerHTML( |
| 165 "<style>" |
| 166 " body { height: 3500px }" |
| 167 " #div {" |
| 168 " position: relative; background-color: pink;" |
| 169 " top: 5px; left: 5px; width: 100px; height: 3500px;" |
| 170 " }" |
| 171 " #inline { padding-left: 10px }" |
| 172 "</style>" |
| 173 "<div id='div'>" |
| 174 " <a id='inline'>text</a>" |
| 175 " <p id='block'>Some text</p>" |
| 176 "</div>"); |
| 177 |
| 178 ScrollableArea* viewport = layoutViewport(); |
| 179 Element* inlineElem = document().getElementById("inline"); |
| 180 EXPECT_TRUE(inlineElem->layoutObject()->parent()->isAnonymous()); |
| 181 |
| 182 // Scroll #div into view, making anonymous block a viable candidate. |
| 183 document().getElementById("div")->scrollIntoView(); |
| 184 |
| 185 // Trigger layout and verify that we don't anchor to the anonymous block. |
| 186 document().getElementById("div")->setAttribute(HTMLNames::styleAttr, |
| 187 AtomicString("top: 6px")); |
| 188 update(); |
| 189 EXPECT_EQ(inlineElem->layoutObject()->slowFirstChild(), |
| 190 scrollAnchor(viewport).anchorObject()); |
| 191 } |
| 192 |
| 162 TEST_F(ScrollAnchorTest, FullyContainedInlineBlock) | 193 TEST_F(ScrollAnchorTest, FullyContainedInlineBlock) |
| 163 { | 194 { |
| 164 // Exercises every WalkStatus value: | 195 // Exercises every WalkStatus value: |
| 165 // html, body -> Constrain | 196 // html, body -> Constrain |
| 166 // #outer -> Continue | 197 // #outer -> Continue |
| 167 // #ib1, br -> Skip | 198 // #ib1, br -> Skip |
| 168 // #ib2 -> Return | 199 // #ib2 -> Return |
| 169 setBodyInnerHTML( | 200 setBodyInnerHTML( |
| 170 "<style>" | 201 "<style>" |
| 171 " body { height: 1000px }" | 202 " body { height: 1000px }" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 | 235 |
| 205 setHeight(document().body(), 1100); | 236 setHeight(document().body(), 1100); |
| 206 EXPECT_EQ(document().getElementById("b")->layoutObject()->slowFirstChild(), | 237 EXPECT_EQ(document().getElementById("b")->layoutObject()->slowFirstChild(), |
| 207 scrollAnchor(layoutViewport()).anchorObject()); | 238 scrollAnchor(layoutViewport()).anchorObject()); |
| 208 } | 239 } |
| 209 | 240 |
| 210 TEST_F(ScrollAnchorTest, ExcludeFixedPosition) | 241 TEST_F(ScrollAnchorTest, ExcludeFixedPosition) |
| 211 { | 242 { |
| 212 setBodyInnerHTML( | 243 setBodyInnerHTML( |
| 213 "<style>" | 244 "<style>" |
| 214 " body { height: 1000px; padding: 20px }" | 245 " body { height: 1000px; padding: 20px; }" |
| 215 " div { position: relative; top: 100px; }" | 246 " div { position: relative; top: 100px; }" |
| 216 " #f { position: fixed }" | 247 " #f { position: fixed }" |
| 217 "</style>" | 248 "</style>" |
| 218 "<div id=f>fixed</div>" | 249 "<div id=f>fixed</div>" |
| 219 "<div id=c>content</div>"); | 250 "<div id=c>content</div>"); |
| 220 | 251 |
| 221 scrollLayoutViewport(DoubleSize(0, 50)); | 252 scrollLayoutViewport(DoubleSize(0, 50)); |
| 222 | 253 |
| 223 setHeight(document().body(), 1100); | 254 setHeight(document().body(), 1100); |
| 224 EXPECT_EQ(document().getElementById("c")->layoutObject(), | 255 EXPECT_EQ(document().getElementById("c")->layoutObject(), |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 "<div id=c></div>" | 500 "<div id=c></div>" |
| 470 "<div id=d></div>"); | 501 "<div id=d></div>"); |
| 471 | 502 |
| 472 checkCorner("b", Corner::TopRight, DoublePoint(-20, 20), DoubleSize(0, 0))
; | 503 checkCorner("b", Corner::TopRight, DoublePoint(-20, 20), DoubleSize(0, 0))
; |
| 473 checkCorner("a", Corner::TopRight, DoublePoint(-420, 20), DoubleSize(400, 0
)); | 504 checkCorner("a", Corner::TopRight, DoublePoint(-420, 20), DoubleSize(400, 0
)); |
| 474 checkCorner("d", Corner::TopRight, DoublePoint(-20, 320), DoubleSize(0, -30
0)); | 505 checkCorner("d", Corner::TopRight, DoublePoint(-20, 320), DoubleSize(0, -30
0)); |
| 475 checkCorner("c", Corner::TopRight, DoublePoint(-420, 320), DoubleSize(400, -
300)); | 506 checkCorner("c", Corner::TopRight, DoublePoint(-420, 320), DoubleSize(400, -
300)); |
| 476 } | 507 } |
| 477 | 508 |
| 478 } | 509 } |
| OLD | NEW |