| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2015 Google Inc. All rights reserved. | 2 * Copyright (C) 2015 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 #define MAYBE(test) DISABLED_##test | 149 #define MAYBE(test) DISABLED_##test |
| 150 #else | 150 #else |
| 151 #define MAYBE(test) test | 151 #define MAYBE(test) test |
| 152 #endif | 152 #endif |
| 153 | 153 |
| 154 // Scrolling down should hide top controls. | 154 // Scrolling down should hide top controls. |
| 155 TEST_F(TopControlsTest, MAYBE(HideOnScrollDown)) | 155 TEST_F(TopControlsTest, MAYBE(HideOnScrollDown)) |
| 156 { | 156 { |
| 157 WebViewImpl* webView = initialize(); | 157 WebViewImpl* webView = initialize(); |
| 158 // initialize top controls to be shown. | 158 // initialize top controls to be shown. |
| 159 webView->setTopControlsHeight(50.f, true); | 159 webView->resize(webView->size(), 50.f, true); |
| 160 webView->topControls().setShownRatio(1); | 160 webView->topControls().setShownRatio(1); |
| 161 | 161 |
| 162 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin)); | 162 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin)); |
| 163 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); | 163 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); |
| 164 | 164 |
| 165 // Top controls should be scrolled partially and page should not scroll. | 165 // Top controls should be scrolled partially and page should not scroll. |
| 166 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, -25.f)); | 166 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, -25.f)); |
| 167 EXPECT_FLOAT_EQ(25.f, webView->topControls().contentOffset()); | 167 EXPECT_FLOAT_EQ(25.f, webView->topControls().contentOffset()); |
| 168 EXPECT_POINT_EQ(IntPoint(0, 0), frame()->view()->scrollPosition()); | 168 EXPECT_POINT_EQ(IntPoint(0, 0), frame()->view()->scrollPosition()); |
| 169 | 169 |
| 170 // Top controls should consume 25px and become hidden. Excess scroll should
be consumed by the page. | 170 // Top controls should consume 25px and become hidden. Excess scroll should
be consumed by the page. |
| 171 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, -40.f)); | 171 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, -40.f)); |
| 172 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); | 172 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); |
| 173 EXPECT_POINT_EQ(IntPoint(0, 15), frame()->view()->scrollPosition()); | 173 EXPECT_POINT_EQ(IntPoint(0, 15), frame()->view()->scrollPosition()); |
| 174 | 174 |
| 175 // Only page should consume scroll | 175 // Only page should consume scroll |
| 176 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, -20.f)); | 176 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, -20.f)); |
| 177 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); | 177 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); |
| 178 EXPECT_POINT_EQ(IntPoint(0, 35), frame()->view()->scrollPosition()); | 178 EXPECT_POINT_EQ(IntPoint(0, 35), frame()->view()->scrollPosition()); |
| 179 } | 179 } |
| 180 | 180 |
| 181 // Scrolling up should show top controls. | 181 // Scrolling up should show top controls. |
| 182 TEST_F(TopControlsTest, MAYBE(ShowOnScrollUp)) | 182 TEST_F(TopControlsTest, MAYBE(ShowOnScrollUp)) |
| 183 { | 183 { |
| 184 WebViewImpl* webView = initialize(); | 184 WebViewImpl* webView = initialize(); |
| 185 // initialize top controls to be hidden. | 185 // initialize top controls to be hidden. |
| 186 webView->setTopControlsHeight(50.f, false); | 186 webView->resize(webView->size(), 50.f, false); |
| 187 webView->topControls().setShownRatio(0); | 187 webView->topControls().setShownRatio(0); |
| 188 | 188 |
| 189 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin)); | 189 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin)); |
| 190 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); | 190 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); |
| 191 | 191 |
| 192 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, 10.f)); | 192 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, 10.f)); |
| 193 EXPECT_FLOAT_EQ(10.f, webView->topControls().contentOffset()); | 193 EXPECT_FLOAT_EQ(10.f, webView->topControls().contentOffset()); |
| 194 EXPECT_POINT_EQ(IntPoint(0, 0), frame()->view()->scrollPosition()); | 194 EXPECT_POINT_EQ(IntPoint(0, 0), frame()->view()->scrollPosition()); |
| 195 | 195 |
| 196 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, 50.f)); | 196 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, 50.f)); |
| 197 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); | 197 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); |
| 198 EXPECT_POINT_EQ(IntPoint(0, 0), frame()->view()->scrollPosition()); | 198 EXPECT_POINT_EQ(IntPoint(0, 0), frame()->view()->scrollPosition()); |
| 199 } | 199 } |
| 200 | 200 |
| 201 // Scrolling up after previous scroll downs should cause top controls to be | 201 // Scrolling up after previous scroll downs should cause top controls to be |
| 202 // shown only after all previously scrolled down amount is compensated. | 202 // shown only after all previously scrolled down amount is compensated. |
| 203 TEST_F(TopControlsTest, MAYBE(ScrollDownThenUp)) | 203 TEST_F(TopControlsTest, MAYBE(ScrollDownThenUp)) |
| 204 { | 204 { |
| 205 WebViewImpl* webView = initialize(); | 205 WebViewImpl* webView = initialize(); |
| 206 // initialize top controls to be shown and position page at 100px. | 206 // initialize top controls to be shown and position page at 100px. |
| 207 webView->setTopControlsHeight(50.f, true); | 207 webView->resize(webView->size(), 50.f, true); |
| 208 webView->topControls().setShownRatio(1); | 208 webView->topControls().setShownRatio(1); |
| 209 frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 100), Pr
ogrammaticScroll); | 209 frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 100), Pr
ogrammaticScroll); |
| 210 | 210 |
| 211 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin)); | 211 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin)); |
| 212 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); | 212 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); |
| 213 | 213 |
| 214 // Scroll down to completely hide top controls. Excess deltaY (100px) should
be consumed by the page. | 214 // Scroll down to completely hide top controls. Excess deltaY (100px) should
be consumed by the page. |
| 215 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, -150.f)); | 215 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, -150.f)); |
| 216 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); | 216 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); |
| 217 EXPECT_POINT_EQ(IntPoint(0, 200), frame()->view()->scrollPosition()); | 217 EXPECT_POINT_EQ(IntPoint(0, 200), frame()->view()->scrollPosition()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 235 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); | 235 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); |
| 236 EXPECT_POINT_EQ(IntPoint(0, 50), frame()->view()->scrollPosition()); | 236 EXPECT_POINT_EQ(IntPoint(0, 50), frame()->view()->scrollPosition()); |
| 237 } | 237 } |
| 238 | 238 |
| 239 // Scrolling down should always cause visible top controls to start hiding even | 239 // Scrolling down should always cause visible top controls to start hiding even |
| 240 // if we have been scrolling up previously. | 240 // if we have been scrolling up previously. |
| 241 TEST_F(TopControlsTest, MAYBE(ScrollUpThenDown)) | 241 TEST_F(TopControlsTest, MAYBE(ScrollUpThenDown)) |
| 242 { | 242 { |
| 243 WebViewImpl* webView = initialize(); | 243 WebViewImpl* webView = initialize(); |
| 244 // initialize top controls to be hidden and position page at 100px. | 244 // initialize top controls to be hidden and position page at 100px. |
| 245 webView->setTopControlsHeight(50.f, false); | 245 webView->resize(webView->size(), 50.f, false); |
| 246 webView->topControls().setShownRatio(0); | 246 webView->topControls().setShownRatio(0); |
| 247 frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 100), Pr
ogrammaticScroll); | 247 frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 100), Pr
ogrammaticScroll); |
| 248 | 248 |
| 249 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin)); | 249 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin)); |
| 250 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); | 250 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); |
| 251 | 251 |
| 252 // Scroll up to completely show top controls. Excess deltaY (50px) should be
consumed by the page. | 252 // Scroll up to completely show top controls. Excess deltaY (50px) should be
consumed by the page. |
| 253 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, 100.f)); | 253 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, 100.f)); |
| 254 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); | 254 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); |
| 255 EXPECT_POINT_EQ(IntPoint(0, 50), frame()->view()->scrollPosition()); | 255 EXPECT_POINT_EQ(IntPoint(0, 50), frame()->view()->scrollPosition()); |
| 256 | 256 |
| 257 // Scroll down and ensure only top controls is scrolled | 257 // Scroll down and ensure only top controls is scrolled |
| 258 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, -40.f)); | 258 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, -40.f)); |
| 259 EXPECT_FLOAT_EQ(10.f, webView->topControls().contentOffset()); | 259 EXPECT_FLOAT_EQ(10.f, webView->topControls().contentOffset()); |
| 260 EXPECT_POINT_EQ(IntPoint(0, 50), frame()->view()->scrollPosition()); | 260 EXPECT_POINT_EQ(IntPoint(0, 50), frame()->view()->scrollPosition()); |
| 261 | 261 |
| 262 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, -60.f)); | 262 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, -60.f)); |
| 263 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); | 263 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); |
| 264 EXPECT_POINT_EQ(IntPoint(0, 100), frame()->view()->scrollPosition()); | 264 EXPECT_POINT_EQ(IntPoint(0, 100), frame()->view()->scrollPosition()); |
| 265 } | 265 } |
| 266 | 266 |
| 267 // Top controls should not consume horizontal scroll. | 267 // Top controls should not consume horizontal scroll. |
| 268 TEST_F(TopControlsTest, MAYBE(HorizontalScroll)) | 268 TEST_F(TopControlsTest, MAYBE(HorizontalScroll)) |
| 269 { | 269 { |
| 270 WebViewImpl* webView = initialize(); | 270 WebViewImpl* webView = initialize(); |
| 271 // initialize top controls to be shown. | 271 // initialize top controls to be shown. |
| 272 webView->setTopControlsHeight(50.f, true); | 272 webView->resize(webView->size(), 50.f, true); |
| 273 webView->topControls().setShownRatio(1); | 273 webView->topControls().setShownRatio(1); |
| 274 | 274 |
| 275 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin)); | 275 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin)); |
| 276 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); | 276 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); |
| 277 | 277 |
| 278 // Top controls should not consume horizontal scroll. | 278 // Top controls should not consume horizontal scroll. |
| 279 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
-110.f, -100.f)); | 279 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
-110.f, -100.f)); |
| 280 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); | 280 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); |
| 281 EXPECT_POINT_EQ(IntPoint(110, 50), frame()->view()->scrollPosition()); | 281 EXPECT_POINT_EQ(IntPoint(110, 50), frame()->view()->scrollPosition()); |
| 282 | 282 |
| 283 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
-40.f, 0)); | 283 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
-40.f, 0)); |
| 284 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); | 284 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); |
| 285 EXPECT_POINT_EQ(IntPoint(150, 50), frame()->view()->scrollPosition()); | 285 EXPECT_POINT_EQ(IntPoint(150, 50), frame()->view()->scrollPosition()); |
| 286 } | 286 } |
| 287 | 287 |
| 288 // Page scale should not impact top controls scrolling | 288 // Page scale should not impact top controls scrolling |
| 289 TEST_F(TopControlsTest, MAYBE(PageScaleHasNoImpact)) | 289 TEST_F(TopControlsTest, MAYBE(PageScaleHasNoImpact)) |
| 290 { | 290 { |
| 291 WebViewImpl* webView = initialize(); | 291 WebViewImpl* webView = initialize(); |
| 292 webViewImpl()->setDefaultPageScaleLimits(0.25f, 5); | 292 webViewImpl()->setDefaultPageScaleLimits(0.25f, 5); |
| 293 webView->setPageScaleFactor(2.0); | 293 webView->setPageScaleFactor(2.0); |
| 294 | 294 |
| 295 // Initialize top controls to be shown. | 295 // Initialize top controls to be shown. |
| 296 webView->setTopControlsHeight(50.f, true); | 296 webView->resize(webView->size(), 50.f, true); |
| 297 webView->topControls().setShownRatio(1); | 297 webView->topControls().setShownRatio(1); |
| 298 | 298 |
| 299 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin)); | 299 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollBegin)); |
| 300 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); | 300 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); |
| 301 | 301 |
| 302 // Top controls should be scrolled partially and page should not scroll. | 302 // Top controls should be scrolled partially and page should not scroll. |
| 303 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, -20.f)); | 303 webView->handleInputEvent(generateEvent(WebInputEvent::GestureScrollUpdate,
0, -20.f)); |
| 304 EXPECT_FLOAT_EQ(30.f, webView->topControls().contentOffset()); | 304 EXPECT_FLOAT_EQ(30.f, webView->topControls().contentOffset()); |
| 305 EXPECT_POINT_EQ(IntPoint(0, 0), frame()->view()->getScrollableArea()->scroll
PositionDouble()); | 305 EXPECT_POINT_EQ(IntPoint(0, 0), frame()->view()->getScrollableArea()->scroll
PositionDouble()); |
| 306 | 306 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 332 // floating-point number. Make sure that if the top controls aren't fully | 332 // floating-point number. Make sure that if the top controls aren't fully |
| 333 // scrolled, scrollBy doesn't return any excess delta. i.e. There should be no | 333 // scrolled, scrollBy doesn't return any excess delta. i.e. There should be no |
| 334 // slippage between the content and top controls. | 334 // slippage between the content and top controls. |
| 335 TEST_F(TopControlsTest, MAYBE(FloatingPointSlippage)) | 335 TEST_F(TopControlsTest, MAYBE(FloatingPointSlippage)) |
| 336 { | 336 { |
| 337 WebViewImpl* webView = initialize(); | 337 WebViewImpl* webView = initialize(); |
| 338 webViewImpl()->setDefaultPageScaleLimits(0.25f, 5); | 338 webViewImpl()->setDefaultPageScaleLimits(0.25f, 5); |
| 339 webView->setPageScaleFactor(2.0); | 339 webView->setPageScaleFactor(2.0); |
| 340 | 340 |
| 341 // Initialize top controls to be shown. | 341 // Initialize top controls to be shown. |
| 342 webView->setTopControlsHeight(50.f, true); | 342 webView->resize(webView->size(), 50.f, true); |
| 343 webView->topControls().setShownRatio(1); | 343 webView->topControls().setShownRatio(1); |
| 344 | 344 |
| 345 webView->topControls().scrollBegin(); | 345 webView->topControls().scrollBegin(); |
| 346 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); | 346 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); |
| 347 | 347 |
| 348 // This will result in a 20px scroll to the top controls so the show ratio | 348 // This will result in a 20px scroll to the top controls so the show ratio |
| 349 // will be 30/50 == 0.6 which is not representible in a float. Make sure | 349 // will be 30/50 == 0.6 which is not representible in a float. Make sure |
| 350 // that scroll still consumes the whole delta. | 350 // that scroll still consumes the whole delta. |
| 351 FloatSize remainingDelta = webView->topControls().scrollBy(FloatSize(0, 10))
; | 351 FloatSize remainingDelta = webView->topControls().scrollBy(FloatSize(0, 10))
; |
| 352 EXPECT_EQ(0, remainingDelta.height()); | 352 EXPECT_EQ(0, remainingDelta.height()); |
| 353 } | 353 } |
| 354 | 354 |
| 355 // Scrollable subregions should scroll before top controls | 355 // Scrollable subregions should scroll before top controls |
| 356 TEST_F(TopControlsTest, MAYBE(ScrollableSubregionScrollFirst)) | 356 TEST_F(TopControlsTest, MAYBE(ScrollableSubregionScrollFirst)) |
| 357 { | 357 { |
| 358 WebViewImpl* webView = initialize("overflow-scrolling.html"); | 358 WebViewImpl* webView = initialize("overflow-scrolling.html"); |
| 359 webView->setTopControlsHeight(50.f, true); | 359 webView->resize(webView->size(), 50.f, true); |
| 360 webView->topControls().setShownRatio(1); | 360 webView->topControls().setShownRatio(1); |
| 361 frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 50), Pro
grammaticScroll); | 361 frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 50), Pro
grammaticScroll); |
| 362 | 362 |
| 363 // Test scroll down | 363 // Test scroll down |
| 364 // Scroll down should scroll the overflow div first but top controls and mai
n frame should not scroll. | 364 // Scroll down should scroll the overflow div first but top controls and mai
n frame should not scroll. |
| 365 verticalScroll(-800.f); | 365 verticalScroll(-800.f); |
| 366 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); | 366 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); |
| 367 EXPECT_POINT_EQ(IntPoint(0, 50), frame()->view()->scrollPosition()); | 367 EXPECT_POINT_EQ(IntPoint(0, 50), frame()->view()->scrollPosition()); |
| 368 | 368 |
| 369 // Continued scroll down should start hiding top controls but main frame sho
uld not scroll. | 369 // Continued scroll down should start hiding top controls but main frame sho
uld not scroll. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 391 verticalScroll(40.f); | 391 verticalScroll(40.f); |
| 392 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); | 392 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); |
| 393 EXPECT_POINT_EQ(IntPoint(0, 50), frame()->view()->scrollPosition()); | 393 EXPECT_POINT_EQ(IntPoint(0, 50), frame()->view()->scrollPosition()); |
| 394 } | 394 } |
| 395 | 395 |
| 396 | 396 |
| 397 // Scrollable iframes should scroll before top controls | 397 // Scrollable iframes should scroll before top controls |
| 398 TEST_F(TopControlsTest, MAYBE(ScrollableIframeScrollFirst)) | 398 TEST_F(TopControlsTest, MAYBE(ScrollableIframeScrollFirst)) |
| 399 { | 399 { |
| 400 WebViewImpl* webView = initialize("iframe-scrolling.html"); | 400 WebViewImpl* webView = initialize("iframe-scrolling.html"); |
| 401 webView->setTopControlsHeight(50.f, true); | 401 webView->resize(webView->size(), 50.f, true); |
| 402 webView->topControls().setShownRatio(1); | 402 webView->topControls().setShownRatio(1); |
| 403 frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 50), Pro
grammaticScroll); | 403 frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 50), Pro
grammaticScroll); |
| 404 | 404 |
| 405 // Test scroll down | 405 // Test scroll down |
| 406 // Scroll down should scroll the iframe first but top controls and main fram
e should not scroll. | 406 // Scroll down should scroll the iframe first but top controls and main fram
e should not scroll. |
| 407 verticalScroll(-800.f); | 407 verticalScroll(-800.f); |
| 408 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); | 408 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); |
| 409 EXPECT_POINT_EQ(IntPoint(0, 50), frame()->view()->scrollPosition()); | 409 EXPECT_POINT_EQ(IntPoint(0, 50), frame()->view()->scrollPosition()); |
| 410 | 410 |
| 411 // Continued scroll down should start hiding top controls but main frame sho
uld not scroll. | 411 // Continued scroll down should start hiding top controls but main frame sho
uld not scroll. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 432 // Continued scroll down up scroll up the main frame | 432 // Continued scroll down up scroll up the main frame |
| 433 verticalScroll(40.f); | 433 verticalScroll(40.f); |
| 434 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); | 434 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); |
| 435 EXPECT_POINT_EQ(IntPoint(0, 50), frame()->view()->scrollPosition()); | 435 EXPECT_POINT_EQ(IntPoint(0, 50), frame()->view()->scrollPosition()); |
| 436 } | 436 } |
| 437 | 437 |
| 438 // Top controls visibility should remain consistent when height is changed. | 438 // Top controls visibility should remain consistent when height is changed. |
| 439 TEST_F(TopControlsTest, MAYBE(HeightChangeMaintainsVisibility)) | 439 TEST_F(TopControlsTest, MAYBE(HeightChangeMaintainsVisibility)) |
| 440 { | 440 { |
| 441 WebViewImpl* webView = initialize(); | 441 WebViewImpl* webView = initialize(); |
| 442 webView->setTopControlsHeight(20.f, false); | 442 webView->resize(webView->size(), 20.f, false); |
| 443 webView->topControls().setShownRatio(0); | 443 webView->topControls().setShownRatio(0); |
| 444 | 444 |
| 445 webView->setTopControlsHeight(20.f, false); | 445 webView->resize(webView->size(), 20.f, false); |
| 446 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); | 446 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); |
| 447 | 447 |
| 448 webView->setTopControlsHeight(40.f, false); | 448 webView->resize(webView->size(), 40.f, false); |
| 449 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); | 449 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); |
| 450 | 450 |
| 451 // Scroll up to show top controls. | 451 // Scroll up to show top controls. |
| 452 verticalScroll(40.f); | 452 verticalScroll(40.f); |
| 453 EXPECT_FLOAT_EQ(40.f, webView->topControls().contentOffset()); | 453 EXPECT_FLOAT_EQ(40.f, webView->topControls().contentOffset()); |
| 454 | 454 |
| 455 // Changing height of a fully shown top controls should correctly adjust con
tent offset | 455 // Changing height of a fully shown top controls should correctly adjust con
tent offset |
| 456 webView->setTopControlsHeight(30.f, false); | 456 webView->resize(webView->size(), 30.f, false); |
| 457 EXPECT_FLOAT_EQ(30.f, webView->topControls().contentOffset()); | 457 EXPECT_FLOAT_EQ(30.f, webView->topControls().contentOffset()); |
| 458 } | 458 } |
| 459 | 459 |
| 460 // Zero delta should not have any effect on top controls. | 460 // Zero delta should not have any effect on top controls. |
| 461 TEST_F(TopControlsTest, MAYBE(ZeroHeightMeansNoEffect)) | 461 TEST_F(TopControlsTest, MAYBE(ZeroHeightMeansNoEffect)) |
| 462 { | 462 { |
| 463 WebViewImpl* webView = initialize(); | 463 WebViewImpl* webView = initialize(); |
| 464 webView->setTopControlsHeight(0, false); | 464 webView->resize(webView->size(), 0, false); |
| 465 webView->topControls().setShownRatio(0); | 465 webView->topControls().setShownRatio(0); |
| 466 frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 100), Pr
ogrammaticScroll); | 466 frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 100), Pr
ogrammaticScroll); |
| 467 | 467 |
| 468 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); | 468 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); |
| 469 | 469 |
| 470 verticalScroll(20.f); | 470 verticalScroll(20.f); |
| 471 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); | 471 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); |
| 472 EXPECT_POINT_EQ(IntPoint(0, 80), frame()->view()->scrollPosition()); | 472 EXPECT_POINT_EQ(IntPoint(0, 80), frame()->view()->scrollPosition()); |
| 473 | 473 |
| 474 verticalScroll(-30.f); | 474 verticalScroll(-30.f); |
| 475 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); | 475 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); |
| 476 EXPECT_POINT_EQ(IntPoint(0, 110), frame()->view()->scrollPosition()); | 476 EXPECT_POINT_EQ(IntPoint(0, 110), frame()->view()->scrollPosition()); |
| 477 | 477 |
| 478 webView->topControls().setShownRatio(1); | 478 webView->topControls().setShownRatio(1); |
| 479 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); | 479 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); |
| 480 } | 480 } |
| 481 | 481 |
| 482 // Top controls should not hide when scrolling up past limit | 482 // Top controls should not hide when scrolling up past limit |
| 483 TEST_F(TopControlsTest, MAYBE(ScrollUpPastLimitDoesNotHide)) | 483 TEST_F(TopControlsTest, MAYBE(ScrollUpPastLimitDoesNotHide)) |
| 484 { | 484 { |
| 485 WebViewImpl* webView = initialize(); | 485 WebViewImpl* webView = initialize(); |
| 486 // Initialize top controls to be shown | 486 // Initialize top controls to be shown |
| 487 webView->setTopControlsHeight(50.f, true); | 487 webView->resize(webView->size(), 50.f, true); |
| 488 webView->topControls().setShownRatio(1); | 488 webView->topControls().setShownRatio(1); |
| 489 // Use 2x scale so that both visual viewport and frameview are scrollable | 489 // Use 2x scale so that both visual viewport and frameview are scrollable |
| 490 webView->setPageScaleFactor(2.0); | 490 webView->setPageScaleFactor(2.0); |
| 491 | 491 |
| 492 // Fully scroll frameview but visualviewport remains scrollable | 492 // Fully scroll frameview but visualviewport remains scrollable |
| 493 webView->mainFrame()->setScrollOffset(WebSize(0, 10000)); | 493 webView->mainFrame()->setScrollOffset(WebSize(0, 10000)); |
| 494 visualViewport().setLocation(FloatPoint(0, 0)); | 494 visualViewport().setLocation(FloatPoint(0, 0)); |
| 495 verticalScroll(-10.f); | 495 verticalScroll(-10.f); |
| 496 EXPECT_FLOAT_EQ(40, webView->topControls().contentOffset()); | 496 EXPECT_FLOAT_EQ(40, webView->topControls().contentOffset()); |
| 497 | 497 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 509 verticalScroll(-30.f); | 509 verticalScroll(-30.f); |
| 510 // Top controls should not move because neither frameview nor visual viewpor
t | 510 // Top controls should not move because neither frameview nor visual viewpor
t |
| 511 // are scrollable | 511 // are scrollable |
| 512 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); | 512 EXPECT_FLOAT_EQ(50.f, webView->topControls().contentOffset()); |
| 513 } | 513 } |
| 514 | 514 |
| 515 // Top controls should honor its constraints | 515 // Top controls should honor its constraints |
| 516 TEST_F(TopControlsTest, MAYBE(StateConstraints)) | 516 TEST_F(TopControlsTest, MAYBE(StateConstraints)) |
| 517 { | 517 { |
| 518 WebViewImpl* webView = initialize(); | 518 WebViewImpl* webView = initialize(); |
| 519 webView->setTopControlsHeight(50.f, false); | 519 webView->resize(webView->size(), 50.f, false); |
| 520 frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 100), Pr
ogrammaticScroll); | 520 frame()->view()->getScrollableArea()->setScrollPosition(IntPoint(0, 100), Pr
ogrammaticScroll); |
| 521 | 521 |
| 522 // Setting permitted state should not change content offset | 522 // Setting permitted state should not change content offset |
| 523 webView->updateTopControlsState(WebTopControlsShown, WebTopControlsShown, fa
lse); | 523 webView->updateTopControlsState(WebTopControlsShown, WebTopControlsShown, fa
lse); |
| 524 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); | 524 EXPECT_FLOAT_EQ(0.f, webView->topControls().contentOffset()); |
| 525 | 525 |
| 526 // Showing is permitted | 526 // Showing is permitted |
| 527 webView->topControls().setShownRatio(1); | 527 webView->topControls().setShownRatio(1); |
| 528 EXPECT_FLOAT_EQ(50, webView->topControls().contentOffset()); | 528 EXPECT_FLOAT_EQ(50, webView->topControls().contentOffset()); |
| 529 | 529 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 558 EXPECT_FLOAT_EQ(0, webView->topControls().contentOffset()); | 558 EXPECT_FLOAT_EQ(0, webView->topControls().contentOffset()); |
| 559 EXPECT_POINT_EQ(IntPoint(0, 90), frame()->view()->scrollPosition()); | 559 EXPECT_POINT_EQ(IntPoint(0, 90), frame()->view()->scrollPosition()); |
| 560 } | 560 } |
| 561 | 561 |
| 562 // Ensure that top controls do not affect the layout by showing and hiding | 562 // Ensure that top controls do not affect the layout by showing and hiding |
| 563 // except for position: fixed elements. | 563 // except for position: fixed elements. |
| 564 TEST_F(TopControlsTest, MAYBE(DontAffectLayoutHeight)) | 564 TEST_F(TopControlsTest, MAYBE(DontAffectLayoutHeight)) |
| 565 { | 565 { |
| 566 // Initialize with the top controls showing. | 566 // Initialize with the top controls showing. |
| 567 WebViewImpl* webView = initialize("percent-height.html"); | 567 WebViewImpl* webView = initialize("percent-height.html"); |
| 568 webView->setTopControlsHeight(100.f, true); | 568 webView->resize(webView->size(), 100.f, true); |
| 569 webView->updateTopControlsState( | 569 webView->updateTopControlsState( |
| 570 WebTopControlsBoth, WebTopControlsShown, false); | 570 WebTopControlsBoth, WebTopControlsShown, false); |
| 571 webView->topControls().setShownRatio(1); | 571 webView->topControls().setShownRatio(1); |
| 572 webView->resize(WebSize(400, 300)); | 572 webView->resize(WebSize(400, 300)); |
| 573 webView->updateAllLifecyclePhases(); | 573 webView->updateAllLifecyclePhases(); |
| 574 | 574 |
| 575 ASSERT_EQ(100.f, webView->topControls().contentOffset()); | 575 ASSERT_EQ(100.f, webView->topControls().contentOffset()); |
| 576 | 576 |
| 577 // When the top controls are showing, there's 300px for the layout height so | 577 // When the top controls are showing, there's 300px for the layout height so |
| 578 // 50% should result in both the position:fixed and position: absolute divs | 578 // 50% should result in both the position:fixed and position: absolute divs |
| 579 // having 150px of height. | 579 // having 150px of height. |
| 580 RawPtr<Element> absPos = | 580 RawPtr<Element> absPos = |
| 581 getElementById(WebString::fromUTF8("abs")); | 581 getElementById(WebString::fromUTF8("abs")); |
| 582 RawPtr<Element> fixedPos = | 582 RawPtr<Element> fixedPos = |
| 583 getElementById(WebString::fromUTF8("fixed")); | 583 getElementById(WebString::fromUTF8("fixed")); |
| 584 EXPECT_FLOAT_EQ(150.f, absPos->getBoundingClientRect()->height()); | 584 EXPECT_FLOAT_EQ(150.f, absPos->getBoundingClientRect()->height()); |
| 585 EXPECT_FLOAT_EQ(150.f, fixedPos->getBoundingClientRect()->height()); | 585 EXPECT_FLOAT_EQ(150.f, fixedPos->getBoundingClientRect()->height()); |
| 586 | 586 |
| 587 // The layout size on the FrameView should not include the top controls. | 587 // The layout size on the FrameView should not include the top controls. |
| 588 EXPECT_EQ(300, frame()->view()->layoutSize(IncludeScrollbars).height()); | 588 EXPECT_EQ(300, frame()->view()->layoutSize(IncludeScrollbars).height()); |
| 589 | 589 |
| 590 // Hide the top controls. | 590 // Hide the top controls. |
| 591 verticalScroll(-100.f); | 591 verticalScroll(-100.f); |
| 592 webView->setTopControlsHeight(100.f, false); | 592 webView->resize(WebSize(400, 400), 100.f, false); |
| 593 webView->resize(WebSize(400, 400)); | |
| 594 webView->updateAllLifecyclePhases(); | 593 webView->updateAllLifecyclePhases(); |
| 595 | 594 |
| 596 ASSERT_EQ(0.f, webView->topControls().contentOffset()); | 595 ASSERT_EQ(0.f, webView->topControls().contentOffset()); |
| 597 | 596 |
| 598 // Hiding the top controls shouldn't change the height of the initial | 597 // Hiding the top controls shouldn't change the height of the initial |
| 599 // containing block for non-position: fixed. Position: fixed however should | 598 // containing block for non-position: fixed. Position: fixed however should |
| 600 // use the entire height of the viewport however. | 599 // use the entire height of the viewport however. |
| 601 EXPECT_FLOAT_EQ(150.f, absPos->getBoundingClientRect()->height()); | 600 EXPECT_FLOAT_EQ(150.f, absPos->getBoundingClientRect()->height()); |
| 602 EXPECT_FLOAT_EQ(200.f, fixedPos->getBoundingClientRect()->height()); | 601 EXPECT_FLOAT_EQ(200.f, fixedPos->getBoundingClientRect()->height()); |
| 603 | 602 |
| 604 // The layout size should not change as a result of top controls hiding. | 603 // The layout size should not change as a result of top controls hiding. |
| 605 EXPECT_EQ(300, frame()->view()->layoutSize(IncludeScrollbars).height()); | 604 EXPECT_EQ(300, frame()->view()->layoutSize(IncludeScrollbars).height()); |
| 606 } | 605 } |
| 607 | 606 |
| 608 // Ensure that top controls do not affect vh units. | 607 // Ensure that top controls do not affect vh units. |
| 609 TEST_F(TopControlsTest, MAYBE(DontAffectVHUnits)) | 608 TEST_F(TopControlsTest, MAYBE(DontAffectVHUnits)) |
| 610 { | 609 { |
| 611 // Initialize with the top controls showing. | 610 // Initialize with the top controls showing. |
| 612 WebViewImpl* webView = initialize("vh-height.html"); | 611 WebViewImpl* webView = initialize("vh-height.html"); |
| 613 webView->setTopControlsHeight(100.f, true); | 612 webView->resize(WebSize(400, 300), 100.f, true); |
| 614 webView->updateTopControlsState( | 613 webView->updateTopControlsState( |
| 615 WebTopControlsBoth, WebTopControlsShown, false); | 614 WebTopControlsBoth, WebTopControlsShown, false); |
| 616 webView->topControls().setShownRatio(1); | 615 webView->topControls().setShownRatio(1); |
| 617 webView->resize(WebSize(400, 300)); | |
| 618 webView->updateAllLifecyclePhases(); | 616 webView->updateAllLifecyclePhases(); |
| 619 | 617 |
| 620 ASSERT_EQ(100.f, webView->topControls().contentOffset()); | 618 ASSERT_EQ(100.f, webView->topControls().contentOffset()); |
| 621 | 619 |
| 622 // 'vh' units should be based on the viewport when the top controls are | 620 // 'vh' units should be based on the viewport when the top controls are |
| 623 // hidden. | 621 // hidden. |
| 624 RawPtr<Element> absPos = | 622 RawPtr<Element> absPos = |
| 625 getElementById(WebString::fromUTF8("abs")); | 623 getElementById(WebString::fromUTF8("abs")); |
| 626 RawPtr<Element> fixedPos = | 624 RawPtr<Element> fixedPos = |
| 627 getElementById(WebString::fromUTF8("fixed")); | 625 getElementById(WebString::fromUTF8("fixed")); |
| 628 EXPECT_FLOAT_EQ(200.f, absPos->getBoundingClientRect()->height()); | 626 EXPECT_FLOAT_EQ(200.f, absPos->getBoundingClientRect()->height()); |
| 629 EXPECT_FLOAT_EQ(200.f, fixedPos->getBoundingClientRect()->height()); | 627 EXPECT_FLOAT_EQ(200.f, fixedPos->getBoundingClientRect()->height()); |
| 630 | 628 |
| 631 // The size used for viewport units should not be reduced by the top | 629 // The size used for viewport units should not be reduced by the top |
| 632 // controls. | 630 // controls. |
| 633 EXPECT_EQ(400, frame()->view()->viewportSizeForViewportUnits().height()); | 631 EXPECT_EQ(400, frame()->view()->viewportSizeForViewportUnits().height()); |
| 634 | 632 |
| 635 // Hide the top controls. | 633 // Hide the top controls. |
| 636 verticalScroll(-100.f); | 634 verticalScroll(-100.f); |
| 637 webView->setTopControlsHeight(100.f, false); | 635 webView->resize(WebSize(400, 400), 100.f, false); |
| 638 webView->resize(WebSize(400, 400)); | |
| 639 webView->updateAllLifecyclePhases(); | 636 webView->updateAllLifecyclePhases(); |
| 640 | 637 |
| 641 ASSERT_EQ(0.f, webView->topControls().contentOffset()); | 638 ASSERT_EQ(0.f, webView->topControls().contentOffset()); |
| 642 | 639 |
| 643 // vh units should be static with respect to the top controls so neighter | 640 // vh units should be static with respect to the top controls so neighter |
| 644 // <div> should change size are a result of the top controls hiding. | 641 // <div> should change size are a result of the top controls hiding. |
| 645 EXPECT_FLOAT_EQ(200.f, absPos->getBoundingClientRect()->height()); | 642 EXPECT_FLOAT_EQ(200.f, absPos->getBoundingClientRect()->height()); |
| 646 EXPECT_FLOAT_EQ(200.f, fixedPos->getBoundingClientRect()->height()); | 643 EXPECT_FLOAT_EQ(200.f, fixedPos->getBoundingClientRect()->height()); |
| 647 | 644 |
| 648 // The viewport size used for vh units should not change as a result of top | 645 // The viewport size used for vh units should not change as a result of top |
| 649 // controls hiding. | 646 // controls hiding. |
| 650 EXPECT_EQ(400, frame()->view()->viewportSizeForViewportUnits().height()); | 647 EXPECT_EQ(400, frame()->view()->viewportSizeForViewportUnits().height()); |
| 651 } | 648 } |
| 652 | 649 |
| 653 // Ensure that on a legacy page (there's a non-1 minimum scale) 100vh units fill | 650 // Ensure that on a legacy page (there's a non-1 minimum scale) 100vh units fill |
| 654 // the viewport, with top controls hidden, when the viewport encompasses the | 651 // the viewport, with top controls hidden, when the viewport encompasses the |
| 655 // layout width. | 652 // layout width. |
| 656 TEST_F(TopControlsTest, MAYBE(DontAffectVHUnitsWithScale)) | 653 TEST_F(TopControlsTest, MAYBE(DontAffectVHUnitsWithScale)) |
| 657 { | 654 { |
| 658 // Initialize with the top controls showing. | 655 // Initialize with the top controls showing. |
| 659 WebViewImpl* webView = initialize("vh-height-width-800.html"); | 656 WebViewImpl* webView = initialize("vh-height-width-800.html"); |
| 660 webView->setTopControlsHeight(100.f, true); | 657 webView->resize(WebSize(400, 300), 100.f, true); |
| 661 webView->updateTopControlsState( | 658 webView->updateTopControlsState( |
| 662 WebTopControlsBoth, WebTopControlsShown, false); | 659 WebTopControlsBoth, WebTopControlsShown, false); |
| 663 webView->topControls().setShownRatio(1); | 660 webView->topControls().setShownRatio(1); |
| 664 webView->resize(WebSize(400, 300)); | |
| 665 webView->updateAllLifecyclePhases(); | 661 webView->updateAllLifecyclePhases(); |
| 666 | 662 |
| 667 ASSERT_EQ(100.f, webView->topControls().contentOffset()); | 663 ASSERT_EQ(100.f, webView->topControls().contentOffset()); |
| 668 | 664 |
| 669 // Device viewport is 400px but the page is width=800 so minimum-scale | 665 // Device viewport is 400px but the page is width=800 so minimum-scale |
| 670 // should be 0.5. This is also the scale at which the viewport fills the | 666 // should be 0.5. This is also the scale at which the viewport fills the |
| 671 // layout width. | 667 // layout width. |
| 672 ASSERT_EQ(0.5f, webView->minimumPageScaleFactor()); | 668 ASSERT_EQ(0.5f, webView->minimumPageScaleFactor()); |
| 673 | 669 |
| 674 // We should size vh units so that 100vh fills the viewport at min-scale so | 670 // We should size vh units so that 100vh fills the viewport at min-scale so |
| 675 // we have to account for the minimum page scale factor. Since both boxes | 671 // we have to account for the minimum page scale factor. Since both boxes |
| 676 // are 50vh, and layout scale = 0.5, we have a vh viewport of 400 / 0.5 = 80
0 | 672 // are 50vh, and layout scale = 0.5, we have a vh viewport of 400 / 0.5 = 80
0 |
| 677 // so we expect 50vh to be 400px. | 673 // so we expect 50vh to be 400px. |
| 678 RawPtr<Element> absPos = | 674 RawPtr<Element> absPos = |
| 679 getElementById(WebString::fromUTF8("abs")); | 675 getElementById(WebString::fromUTF8("abs")); |
| 680 RawPtr<Element> fixedPos = | 676 RawPtr<Element> fixedPos = |
| 681 getElementById(WebString::fromUTF8("fixed")); | 677 getElementById(WebString::fromUTF8("fixed")); |
| 682 EXPECT_FLOAT_EQ(400.f, absPos->getBoundingClientRect()->height()); | 678 EXPECT_FLOAT_EQ(400.f, absPos->getBoundingClientRect()->height()); |
| 683 EXPECT_FLOAT_EQ(400.f, fixedPos->getBoundingClientRect()->height()); | 679 EXPECT_FLOAT_EQ(400.f, fixedPos->getBoundingClientRect()->height()); |
| 684 | 680 |
| 685 // The size used for viewport units should not be reduced by the top | 681 // The size used for viewport units should not be reduced by the top |
| 686 // controls. | 682 // controls. |
| 687 EXPECT_EQ(800, frame()->view()->viewportSizeForViewportUnits().height()); | 683 EXPECT_EQ(800, frame()->view()->viewportSizeForViewportUnits().height()); |
| 688 | 684 |
| 689 // Hide the top controls. | 685 // Hide the top controls. |
| 690 verticalScroll(-100.f); | 686 verticalScroll(-100.f); |
| 691 webView->setTopControlsHeight(100.f, false); | 687 webView->resize(WebSize(400, 400), 100.f, false); |
| 692 webView->resize(WebSize(400, 400)); | |
| 693 webView->updateAllLifecyclePhases(); | 688 webView->updateAllLifecyclePhases(); |
| 694 | 689 |
| 695 ASSERT_EQ(0.f, webView->topControls().contentOffset()); | 690 ASSERT_EQ(0.f, webView->topControls().contentOffset()); |
| 696 | 691 |
| 697 // vh units should be static with respect to the top controls so neighter | 692 // vh units should be static with respect to the top controls so neighter |
| 698 // <div> should change size are a result of the top controls hiding. | 693 // <div> should change size are a result of the top controls hiding. |
| 699 EXPECT_FLOAT_EQ(400.f, absPos->getBoundingClientRect()->height()); | 694 EXPECT_FLOAT_EQ(400.f, absPos->getBoundingClientRect()->height()); |
| 700 EXPECT_FLOAT_EQ(400.f, fixedPos->getBoundingClientRect()->height()); | 695 EXPECT_FLOAT_EQ(400.f, fixedPos->getBoundingClientRect()->height()); |
| 701 | 696 |
| 702 // The viewport size used for vh units should not change as a result of top | 697 // The viewport size used for vh units should not change as a result of top |
| 703 // controls hiding. | 698 // controls hiding. |
| 704 EXPECT_EQ(800, frame()->view()->viewportSizeForViewportUnits().height()); | 699 EXPECT_EQ(800, frame()->view()->viewportSizeForViewportUnits().height()); |
| 705 } | 700 } |
| 706 | 701 |
| 707 // Ensure that on a legacy page (there's a non-1 minimum scale) whose viewport | 702 // Ensure that on a legacy page (there's a non-1 minimum scale) whose viewport |
| 708 // at minimum-scale is larger than the layout size, 100vh units fill the | 703 // at minimum-scale is larger than the layout size, 100vh units fill the |
| 709 // viewport, with top controls hidden, when the viewport is scaled such that | 704 // viewport, with top controls hidden, when the viewport is scaled such that |
| 710 // its width equals the layout width. | 705 // its width equals the layout width. |
| 711 TEST_F(TopControlsTest, MAYBE(DontAffectVHUnitsUseLayoutSize)) | 706 TEST_F(TopControlsTest, MAYBE(DontAffectVHUnitsUseLayoutSize)) |
| 712 { | 707 { |
| 713 // Initialize with the top controls showing. | 708 // Initialize with the top controls showing. |
| 714 WebViewImpl* webView = initialize("vh-height-width-800-extra-wide.html"); | 709 WebViewImpl* webView = initialize("vh-height-width-800-extra-wide.html"); |
| 715 webView->setTopControlsHeight(100.f, true); | 710 webView->resize(WebSize(400, 300), 100.f, true); |
| 716 webView->updateTopControlsState( | 711 webView->updateTopControlsState( |
| 717 WebTopControlsBoth, WebTopControlsShown, false); | 712 WebTopControlsBoth, WebTopControlsShown, false); |
| 718 webView->topControls().setShownRatio(1); | 713 webView->topControls().setShownRatio(1); |
| 719 webView->resize(WebSize(400, 300)); | |
| 720 webView->updateAllLifecyclePhases(); | 714 webView->updateAllLifecyclePhases(); |
| 721 | 715 |
| 722 ASSERT_EQ(100.f, webView->topControls().contentOffset()); | 716 ASSERT_EQ(100.f, webView->topControls().contentOffset()); |
| 723 | 717 |
| 724 // Device viewport is 400px and page is width=800 but there's an element | 718 // Device viewport is 400px and page is width=800 but there's an element |
| 725 // that's 1600px wide so the minimum scale is 0.25 to encompass that. | 719 // that's 1600px wide so the minimum scale is 0.25 to encompass that. |
| 726 ASSERT_EQ(0.25f, webView->minimumPageScaleFactor()); | 720 ASSERT_EQ(0.25f, webView->minimumPageScaleFactor()); |
| 727 | 721 |
| 728 // The viewport will match the layout width at scale=0.5 so the height used | 722 // The viewport will match the layout width at scale=0.5 so the height used |
| 729 // for vh should be (300 / 0.5) for the layout height + (100 / 0.5) for top | 723 // for vh should be (300 / 0.5) for the layout height + (100 / 0.5) for top |
| 730 // controls = 800. | 724 // controls = 800. |
| 731 EXPECT_EQ(800, frame()->view()->viewportSizeForViewportUnits().height()); | 725 EXPECT_EQ(800, frame()->view()->viewportSizeForViewportUnits().height()); |
| 732 } | 726 } |
| 733 | 727 |
| 728 // This tests that the viewport remains anchored when top controls are brought |
| 729 // in while the document is fully scrolled. This normally causes clamping of the |
| 730 // visual viewport to keep it bounded by the layout viewport so we're testing |
| 731 // that the viewport anchoring logic is working to keep the view unchanged. |
| 732 TEST_F(TopControlsTest, MAYBE(AnchorViewportDuringIncreasingAdjustment)) |
| 733 { |
| 734 int contentHeight = 1016; |
| 735 int layoutViewportHeight = 500; |
| 736 int visualViewportHeight = 500; |
| 737 int topControlsHeight = 100; |
| 738 int pageScale = 2; |
| 739 int minScale = 1; |
| 740 |
| 741 // Initialize with the top controls showing. |
| 742 WebViewImpl* webView = initialize("large-div.html"); |
| 743 webViewImpl()->setDefaultPageScaleLimits(minScale, 5); |
| 744 webView->updateTopControlsState( |
| 745 WebTopControlsBoth, WebTopControlsShown, false); |
| 746 webView->topControls().setShownRatio(1); |
| 747 webView->resize( |
| 748 WebSize(800, layoutViewportHeight), |
| 749 topControlsHeight, |
| 750 true); |
| 751 webView->updateAllLifecyclePhases(); |
| 752 |
| 753 FrameView* view = frame()->view(); |
| 754 ScrollableArea* rootViewport = frame()->view()->getScrollableArea(); |
| 755 |
| 756 int expectedVisualOffset = |
| 757 ((layoutViewportHeight + topControlsHeight / minScale) * pageScale |
| 758 - (visualViewportHeight + topControlsHeight)) |
| 759 / pageScale; |
| 760 int expectedLayoutOffset = |
| 761 contentHeight - (layoutViewportHeight + topControlsHeight / minScale); |
| 762 int expectedRootOffset = expectedVisualOffset + expectedLayoutOffset; |
| 763 |
| 764 // Zoom in to 2X and fully scroll both viewports. |
| 765 webView->setPageScaleFactor(pageScale); |
| 766 { |
| 767 webView->handleInputEvent( |
| 768 generateEvent(WebInputEvent::GestureScrollBegin)); |
| 769 webView->handleInputEvent( |
| 770 generateEvent(WebInputEvent::GestureScrollUpdate, 0, -10000)); |
| 771 |
| 772 ASSERT_EQ(0.f, webView->topControls().contentOffset()); |
| 773 |
| 774 EXPECT_EQ(expectedVisualOffset, visualViewport().location().y()); |
| 775 EXPECT_EQ(expectedLayoutOffset, |
| 776 view->layoutViewportScrollableArea()->scrollPosition().y()); |
| 777 EXPECT_EQ(expectedRootOffset, rootViewport->scrollPosition().y()); |
| 778 |
| 779 webView->handleInputEvent( |
| 780 generateEvent(WebInputEvent::GestureScrollEnd)); |
| 781 } |
| 782 |
| 783 // Commit the top controls resize so that the top controls do not shrink the |
| 784 // layout size. This should not have moved any of the viewports. |
| 785 webView->resize( |
| 786 WebSize(800, layoutViewportHeight + topControlsHeight), |
| 787 topControlsHeight, |
| 788 false); |
| 789 webView->updateAllLifecyclePhases(); |
| 790 ASSERT_EQ(expectedVisualOffset, visualViewport().location().y()); |
| 791 ASSERT_EQ(expectedLayoutOffset, |
| 792 view->layoutViewportScrollableArea()->scrollPosition().y()); |
| 793 ASSERT_EQ(expectedRootOffset, rootViewport->scrollPosition().y()); |
| 794 |
| 795 // Now scroll back up just enough to show the top controls. The top controls |
| 796 // should shrink both viewports but the layout viewport by a greater amount. |
| 797 // This means the visual viewport's offset must be clamped to keep it within |
| 798 // the layout viewport. Make sure we adjust the scroll position to account |
| 799 // for this and keep the visual viewport at the same location relative to |
| 800 // the document (i.e. the user shouldn't see a movement). |
| 801 { |
| 802 webView->handleInputEvent( |
| 803 generateEvent(WebInputEvent::GestureScrollBegin)); |
| 804 webView->handleInputEvent( |
| 805 generateEvent(WebInputEvent::GestureScrollUpdate, 0, 80)); |
| 806 |
| 807 visualViewport().clampToBoundaries(); |
| 808 view->setScrollPosition(view->scrollPosition(), ProgrammaticScroll); |
| 809 |
| 810 ASSERT_EQ(80.f, webView->topControls().contentOffset()); |
| 811 EXPECT_EQ(expectedRootOffset, rootViewport->scrollPosition().y()); |
| 812 |
| 813 webView->handleInputEvent( |
| 814 generateEvent(WebInputEvent::GestureScrollEnd)); |
| 815 } |
| 816 } |
| 817 |
| 734 } // namespace blink | 818 } // namespace blink |
| OLD | NEW |