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

Side by Side Diff: third_party/WebKit/Source/web/tests/RootScrollerTest.cpp

Issue 1970763002: Fixed up root scroller API to be more webby (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Sigh...fix test expectation again, fix crash when there's no renderer Created 4 years, 6 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/page/scrolling/RootScroller.h" 5 #include "core/page/scrolling/RootScroller.h"
6 6
7 #include "core/frame/FrameHost.h" 7 #include "core/frame/FrameHost.h"
8 #include "core/frame/FrameView.h" 8 #include "core/frame/FrameView.h"
9 #include "core/frame/TopControls.h" 9 #include "core/frame/TopControls.h"
10 #include "core/html/HTMLFrameOwnerElement.h" 10 #include "core/html/HTMLFrameOwnerElement.h"
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 FrameView* mainFrameView() const 145 FrameView* mainFrameView() const
146 { 146 {
147 return webViewImpl()->mainFrameImpl()->frame()->view(); 147 return webViewImpl()->mainFrameImpl()->frame()->view();
148 } 148 }
149 149
150 VisualViewport& visualViewport() const 150 VisualViewport& visualViewport() const
151 { 151 {
152 return frameHost().visualViewport(); 152 return frameHost().visualViewport();
153 } 153 }
154 154
155 RootScroller& rootScroller() const
156 {
157 return *frameHost().rootScroller();
158 }
159
160 TopControls& topControls() const 155 TopControls& topControls() const
161 { 156 {
162 return frameHost().topControls(); 157 return frameHost().topControls();
163 } 158 }
164 159
165 protected: 160 protected:
166 std::string m_baseURL; 161 std::string m_baseURL;
167 RootScrollerTestWebViewClient m_client; 162 RootScrollerTestWebViewClient m_client;
168 FrameTestHelpers::WebViewHelper m_helper; 163 FrameTestHelpers::WebViewHelper m_helper;
169 RuntimeEnabledFeatures::Backup m_featuresBackup; 164 RuntimeEnabledFeatures::Backup m_featuresBackup;
170 }; 165 };
171 166
172 // Test that a default root scroller element is set if setRootScroller isn't 167 // Test that no root scroller element is set if setRootScroller isn't called on
173 // called on any elements. 168 // any elements. The document element should be the default effective root
169 // scroller.
174 TEST_F(RootScrollerTest, TestDefaultRootScroller) 170 TEST_F(RootScrollerTest, TestDefaultRootScroller)
175 { 171 {
176 initialize("overflow-scrolling.html"); 172 initialize("overflow-scrolling.html");
177 173
178 EXPECT_EQ( 174 ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller());
179 mainFrame()->document()->documentElement(), 175
180 rootScroller().get()); 176 Element* htmlElement = mainFrame()->document()->documentElement();
177 EXPECT_TRUE(mainFrame()->document()->isEffectiveRootScroller(*htmlElement));
181 } 178 }
182 179
183 // Tests that setting an element as the root scroller causes it to control url 180 // Tests that setting an element as the root scroller causes it to control url
184 // bar hiding and overscroll. 181 // bar hiding and overscroll.
185 TEST_F(RootScrollerTest, TestSetRootScroller) 182 TEST_F(RootScrollerTest, TestSetRootScroller)
186 { 183 {
187 initialize("root-scroller.html"); 184 initialize("root-scroller.html");
188 185
189 Element* container = mainFrame()->document()->getElementById("container"); 186 Element* container = mainFrame()->document()->getElementById("container");
190 TrackExceptionState exceptionState; 187 TrackExceptionState exceptionState;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 webViewImpl()->handleInputEvent( 276 webViewImpl()->handleInputEvent(
280 generateEvent(WebInputEvent::GestureScrollUpdate, 0, 30)); 277 generateEvent(WebInputEvent::GestureScrollUpdate, 0, 30));
281 ASSERT_FLOAT_EQ(0.6, topControls().shownRatio()); 278 ASSERT_FLOAT_EQ(0.6, topControls().shownRatio());
282 279
283 webViewImpl()->handleInputEvent( 280 webViewImpl()->handleInputEvent(
284 generateEvent(WebInputEvent::GestureScrollEnd)); 281 generateEvent(WebInputEvent::GestureScrollEnd));
285 } 282 }
286 } 283 }
287 284
288 // Tests that removing the element that is the root scroller from the DOM tree 285 // Tests that removing the element that is the root scroller from the DOM tree
289 // resets the default element to be the root scroller. 286 // doesn't remove it as the root scroller but it does change the effective root
287 // scroller.
290 TEST_F(RootScrollerTest, TestRemoveRootScrollerFromDom) 288 TEST_F(RootScrollerTest, TestRemoveRootScrollerFromDom)
291 { 289 {
292 initialize("root-scroller.html"); 290 initialize("root-scroller.html");
293 291
294 ASSERT_EQ( 292 ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller());
295 mainFrame()->document()->documentElement(),
296 rootScroller().get());
297 293
298 Element* container = mainFrame()->document()->getElementById("container"); 294 Element* container = mainFrame()->document()->getElementById("container");
299 TrackExceptionState exceptionState; 295 TrackExceptionState exceptionState;
300 mainFrame()->document()->setRootScroller(container, exceptionState); 296 mainFrame()->document()->setRootScroller(container, exceptionState);
301 297
302 ASSERT_EQ(container, mainFrame()->document()->rootScroller()); 298 ASSERT_EQ(container, mainFrame()->document()->rootScroller());
299 ASSERT_TRUE(mainFrame()->document()->isEffectiveRootScroller(*container));
303 300
304 mainFrame()->document()->body()->removeChild(container); 301 mainFrame()->document()->body()->removeChild(container);
302 mainFrameView()->updateAllLifecyclePhases();
305 303
306 ASSERT_EQ( 304 ASSERT_EQ(container, mainFrame()->document()->rootScroller());
307 mainFrame()->document()->documentElement(), 305 ASSERT_FALSE(mainFrame()->document()->isEffectiveRootScroller(*container));
308 mainFrame()->document()->rootScroller());
309 } 306 }
310 307
311 // Tests that setting an element that isn't a valid scroller as the root 308 // Tests that setting an element that isn't a valid scroller as the root
312 // scroller fails and doesn't change the current root scroller. 309 // scroller doesn't change the effective root scroller.
313 TEST_F(RootScrollerTest, TestSetRootScrollerOnInvalidElement) 310 TEST_F(RootScrollerTest, TestSetRootScrollerOnInvalidElement)
314 { 311 {
315 initialize("root-scroller.html"); 312 initialize("root-scroller.html");
316 313
317 { 314 {
318 // Set to a non-block element. Should be rejected and a console message 315 // Set to a non-block element. Should be rejected and a console message
319 // logged. 316 // logged.
320 Element* element = mainFrame()->document()->getElementById("nonBlock"); 317 Element* element = mainFrame()->document()->getElementById("nonBlock");
321 TrackExceptionState exceptionState; 318 TrackExceptionState exceptionState;
322 mainFrame()->document()->setRootScroller(element, exceptionState); 319 mainFrame()->document()->setRootScroller(element, exceptionState);
323 ASSERT_EQ( 320 mainFrameView()->updateAllLifecyclePhases();
324 mainFrame()->document()->documentElement(), 321 ASSERT_EQ(element, mainFrame()->document()->rootScroller());
325 mainFrame()->document()->rootScroller()); 322 ASSERT_FALSE(
326 EXPECT_TRUE(exceptionState.hadException()); 323 mainFrame()->document()->isEffectiveRootScroller(*element));
327 } 324 }
328 325
329 { 326 {
330 // Set to an element with no size. 327 // Set to an element with no size.
331 Element* element = mainFrame()->document()->getElementById("empty"); 328 Element* element = mainFrame()->document()->getElementById("empty");
332 TrackExceptionState exceptionState; 329 TrackExceptionState exceptionState;
333 mainFrame()->document()->setRootScroller(element, exceptionState); 330 mainFrame()->document()->setRootScroller(element, exceptionState);
334 ASSERT_EQ( 331 mainFrameView()->updateAllLifecyclePhases();
335 mainFrame()->document()->documentElement(), 332 ASSERT_EQ(element, mainFrame()->document()->rootScroller());
336 mainFrame()->document()->rootScroller()); 333 ASSERT_FALSE(
337 EXPECT_TRUE(exceptionState.hadException()); 334 mainFrame()->document()->isEffectiveRootScroller(*element));
338 } 335 }
339 } 336 }
340 337
341 // Test that the root scroller resets to the default element when the current 338 // Test that the effective root scroller resets to the default element when the
342 // root scroller element becomes invalid as a scroller. 339 // current root scroller element becomes invalid as a scroller.
343 TEST_F(RootScrollerTest, TestRootScrollerBecomesInvalid) 340 TEST_F(RootScrollerTest, TestRootScrollerBecomesInvalid)
344 { 341 {
345 initialize("root-scroller.html"); 342 initialize("root-scroller.html");
346 343
347 ASSERT_EQ( 344 Element* htmlElement = mainFrame()->document()->documentElement();
348 mainFrame()->document()->documentElement(),
349 rootScroller().get());
350
351 Element* container = mainFrame()->document()->getElementById("container"); 345 Element* container = mainFrame()->document()->getElementById("container");
352 TrackExceptionState exceptionState; 346 TrackExceptionState exceptionState;
353 mainFrame()->document()->setRootScroller(container, exceptionState);
354 347
355 ASSERT_EQ(container, mainFrame()->document()->rootScroller()); 348 ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller());
349 ASSERT_TRUE(mainFrame()->document()->isEffectiveRootScroller(*htmlElement));
350
351 {
352 mainFrame()->document()->setRootScroller(container, exceptionState);
353 mainFrameView()->updateAllLifecyclePhases();
354
355 ASSERT_EQ(container, mainFrame()->document()->rootScroller());
356 ASSERT_TRUE(
357 mainFrame()->document()->isEffectiveRootScroller(*container));
358
359 executeScript(
360 "document.querySelector('#container').style.display = 'inline'");
361 mainFrameView()->updateAllLifecyclePhases();
362
363 ASSERT_EQ(container, mainFrame()->document()->rootScroller());
364 ASSERT_TRUE(
365 mainFrame()->document()->isEffectiveRootScroller(*htmlElement));
366 }
356 367
357 executeScript( 368 executeScript(
358 "document.querySelector('#container').style.display = 'inline'"); 369 "document.querySelector('#container').style.display = 'block'");
370 mainFrame()->document()->setRootScroller(nullptr, exceptionState);
371 mainFrameView()->updateAllLifecyclePhases();
372 ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller());
373 ASSERT_TRUE(mainFrame()->document()->isEffectiveRootScroller(*htmlElement));
359 374
360 ASSERT_EQ( 375 {
361 mainFrame()->document()->documentElement(), 376 mainFrame()->document()->setRootScroller(container, exceptionState);
362 mainFrame()->document()->rootScroller()); 377 mainFrameView()->updateAllLifecyclePhases();
378
379 ASSERT_EQ(container, mainFrame()->document()->rootScroller());
380 ASSERT_TRUE(
381 mainFrame()->document()->isEffectiveRootScroller(*container));
382
383 executeScript(
384 "document.querySelector('#container').style.width = '98%'");
385 mainFrameView()->updateAllLifecyclePhases();
386
387 ASSERT_EQ(container, mainFrame()->document()->rootScroller());
388 ASSERT_TRUE(
389 mainFrame()->document()->isEffectiveRootScroller(*htmlElement));
390 }
363 } 391 }
364 392
365 // Tests that setting the root scroller of the top codument to an element that 393 // Tests that setting the root scroller of the top document to an element that
366 // belongs to a nested document fails. 394 // belongs to a nested document works.
367 TEST_F(RootScrollerTest, TestSetRootScrollerOnElementInIframe) 395 TEST_F(RootScrollerTest, TestSetRootScrollerOnElementInIframe)
368 { 396 {
369 initialize("root-scroller-iframe.html"); 397 initialize("root-scroller-iframe.html");
370 398
371 ASSERT_EQ( 399 ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller());
372 mainFrame()->document()->documentElement(),
373 rootScroller().get());
374 400
375 { 401 {
376 // Trying to set an element from a nested document should fail. 402 // Trying to set an element from a nested document should fail.
377 HTMLFrameOwnerElement* iframe = toHTMLFrameOwnerElement( 403 HTMLFrameOwnerElement* iframe = toHTMLFrameOwnerElement(
378 mainFrame()->document()->getElementById("iframe")); 404 mainFrame()->document()->getElementById("iframe"));
379 Element* innerContainer = 405 Element* innerContainer =
380 iframe->contentDocument()->getElementById("container"); 406 iframe->contentDocument()->getElementById("container");
381 407
382 TrackExceptionState exceptionState; 408 TrackExceptionState exceptionState;
383 mainFrame()->document()->setRootScroller( 409 mainFrame()->document()->setRootScroller(
384 innerContainer, 410 innerContainer,
385 exceptionState); 411 exceptionState);
386 EXPECT_TRUE(exceptionState.hadException()); 412 mainFrameView()->updateAllLifecyclePhases();
387 413
388 ASSERT_EQ( 414 ASSERT_EQ(innerContainer, mainFrame()->document()->rootScroller());
389 mainFrame()->document()->documentElement(), 415 ASSERT_TRUE(
390 rootScroller().get()); 416 mainFrame()->document()->isEffectiveRootScroller(*innerContainer));
391 } 417 }
392 418
393 { 419 {
394 // Setting the iframe itself, however, should work. 420 // Setting the iframe itself should also work.
395 HTMLFrameOwnerElement* iframe = toHTMLFrameOwnerElement( 421 HTMLFrameOwnerElement* iframe = toHTMLFrameOwnerElement(
396 mainFrame()->document()->getElementById("iframe")); 422 mainFrame()->document()->getElementById("iframe"));
397 423
398 TrackExceptionState exceptionState; 424 TrackExceptionState exceptionState;
399 mainFrame()->document()->setRootScroller(iframe, exceptionState); 425 mainFrame()->document()->setRootScroller(iframe, exceptionState);
400 EXPECT_FALSE(exceptionState.hadException()); 426 mainFrameView()->updateAllLifecyclePhases();
401 427
402 ASSERT_EQ(iframe, rootScroller().get()); 428 ASSERT_EQ(iframe, mainFrame()->document()->rootScroller());
429 ASSERT_TRUE(
430 mainFrame()->document()->isEffectiveRootScroller(*iframe));
403 } 431 }
404 } 432 }
405 433
406 // Tests that setting an otherwise valid element as the root scroller on a 434 // Tests that setting a valid element as the root scroller on a document within
407 // document within an iframe fails and getting the root scroller in the nested 435 // an iframe works as expected.
408 // document returns the default element.
409 TEST_F(RootScrollerTest, TestRootScrollerWithinIframe) 436 TEST_F(RootScrollerTest, TestRootScrollerWithinIframe)
410 { 437 {
411 initialize("root-scroller-iframe.html"); 438 initialize("root-scroller-iframe.html");
412 439
413 ASSERT_EQ( 440 ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller());
414 mainFrame()->document()->documentElement(),
415 rootScroller().get());
416 441
417 { 442 {
418 // Trying to set an element within nested document should fail.
419 // rootScroller() should always return its documentElement.
420 HTMLFrameOwnerElement* iframe = toHTMLFrameOwnerElement( 443 HTMLFrameOwnerElement* iframe = toHTMLFrameOwnerElement(
421 mainFrame()->document()->getElementById("iframe")); 444 mainFrame()->document()->getElementById("iframe"));
422 445
423 ASSERT_EQ( 446 ASSERT_TRUE(iframe->contentDocument()->isEffectiveRootScroller(
424 iframe->contentDocument()->documentElement(), 447 *iframe->contentDocument()->documentElement()));
425 iframe->contentDocument()->rootScroller());
426 448
427 Element* innerContainer = 449 Element* innerContainer =
428 iframe->contentDocument()->getElementById("container"); 450 iframe->contentDocument()->getElementById("container");
429 TrackExceptionState exceptionState; 451 TrackExceptionState exceptionState;
430 iframe->contentDocument()->setRootScroller( 452 iframe->contentDocument()->setRootScroller(
431 innerContainer, 453 innerContainer,
432 exceptionState); 454 exceptionState);
433 EXPECT_TRUE(exceptionState.hadException()); 455 mainFrameView()->updateAllLifecyclePhases();
434 456
435 ASSERT_EQ( 457 ASSERT_EQ(innerContainer, iframe->contentDocument()->rootScroller());
436 iframe->contentDocument()->documentElement(), 458 ASSERT_TRUE(iframe->contentDocument()->isEffectiveRootScroller(
437 iframe->contentDocument()->rootScroller()); 459 *innerContainer));
438 } 460 }
439 } 461 }
440 462
441 // Tests that trying to set an element as the root scroller of a document inside 463 // Tests that trying to set an element as the root scroller of a document inside
442 // an iframe fails when that element belongs to the parent document. 464 // an iframe fails when that element belongs to the parent document.
443 TEST_F(RootScrollerTest, TestSetRootScrollerOnElementFromOutsideIframe) 465 // TODO(bokan): Recent changes mean this is now possible but should be fixed.
466 TEST_F(RootScrollerTest, DISABLED_TestSetRootScrollerOnElementFromOutsideIframe)
444 { 467 {
445 initialize("root-scroller-iframe.html"); 468 initialize("root-scroller-iframe.html");
446 469
447 ASSERT_EQ( 470 ASSERT_EQ(nullptr, mainFrame()->document()->rootScroller());
448 mainFrame()->document()->documentElement(),
449 rootScroller().get());
450 { 471 {
451 // Try to set the the root scroller of the child document to be the 472 // Try to set the the root scroller of the child document to be the
452 // <iframe> element in the parent document. 473 // <iframe> element in the parent document.
453 HTMLFrameOwnerElement* iframe = toHTMLFrameOwnerElement( 474 HTMLFrameOwnerElement* iframe = toHTMLFrameOwnerElement(
454 mainFrame()->document()->getElementById("iframe")); 475 mainFrame()->document()->getElementById("iframe"));
455 NonThrowableExceptionState nonThrow; 476 NonThrowableExceptionState nonThrow;
456 Element* body = 477 Element* body =
457 mainFrame()->document()->querySelector("body", nonThrow); 478 mainFrame()->document()->querySelector("body", nonThrow);
458 479
459 ASSERT_EQ( 480 ASSERT_EQ(nullptr, iframe->contentDocument()->rootScroller());
460 iframe->contentDocument()->documentElement(),
461 iframe->contentDocument()->rootScroller());
462 481
463 TrackExceptionState exceptionState; 482 TrackExceptionState exceptionState;
464 iframe->contentDocument()->setRootScroller( 483 iframe->contentDocument()->setRootScroller(
465 iframe, 484 iframe,
466 exceptionState); 485 exceptionState);
467 EXPECT_TRUE(exceptionState.hadException());
468 486
469 ASSERT_EQ( 487 ASSERT_EQ(iframe, iframe->contentDocument()->rootScroller());
470 iframe->contentDocument()->documentElement(),
471 iframe->contentDocument()->rootScroller());
472
473 exceptionState.clearException();
474 488
475 // Try to set the root scroller of the child document to be the 489 // Try to set the root scroller of the child document to be the
476 // <body> element of the parent document. 490 // <body> element of the parent document.
477 iframe->contentDocument()->setRootScroller( 491 iframe->contentDocument()->setRootScroller(
478 body, 492 body,
479 exceptionState); 493 exceptionState);
480 EXPECT_TRUE(exceptionState.hadException());
481 494
482 ASSERT_EQ( 495 ASSERT_EQ(body, iframe->contentDocument()->rootScroller());
483 iframe->contentDocument()->documentElement(),
484 iframe->contentDocument()->rootScroller());
485 } 496 }
486 } 497 }
487 498
488 } // namespace 499 } // namespace
489 500
490 } // namespace blink 501 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698