OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/zoom/zoom_controller.h" | 5 #include "components/zoom/zoom_controller.h" |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "base/process/kill.h" | 8 #include "base/process/kill.h" |
9 #include "build/build_config.h" | 9 #include "build/build_config.h" |
10 #include "chrome/browser/profiles/profile.h" | 10 #include "chrome/browser/profiles/profile.h" |
11 #include "chrome/browser/ui/browser.h" | 11 #include "chrome/browser/ui/browser.h" |
12 #include "chrome/browser/ui/browser_commands.h" | 12 #include "chrome/browser/ui/browser_commands.h" |
13 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 13 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
14 #include "chrome/browser/ui/webui/signin/login_ui_test_utils.h" | 14 #include "chrome/browser/ui/webui/signin/login_ui_test_utils.h" |
15 #include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h" | 15 #include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h" |
16 #include "chrome/common/url_constants.h" | 16 #include "chrome/common/url_constants.h" |
17 #include "chrome/test/base/in_process_browser_test.h" | 17 #include "chrome/test/base/in_process_browser_test.h" |
18 #include "chrome/test/base/ui_test_utils.h" | 18 #include "chrome/test/base/ui_test_utils.h" |
19 #include "components/prefs/pref_service.h" | 19 #include "components/prefs/pref_service.h" |
20 #include "components/signin/core/common/profile_management_switches.h" | 20 #include "components/signin/core/common/profile_management_switches.h" |
21 #include "content/public/browser/host_zoom_map.h" | 21 #include "content/public/browser/host_zoom_map.h" |
22 #include "content/public/browser/navigation_entry.h" | 22 #include "content/public/browser/navigation_entry.h" |
23 #include "content/public/browser/render_process_host.h" | 23 #include "content/public/browser/render_process_host.h" |
24 #include "content/public/browser/render_view_host.h" | 24 #include "content/public/browser/render_view_host.h" |
| 25 #include "content/public/browser/storage_partition.h" |
25 #include "content/public/browser/web_contents.h" | 26 #include "content/public/browser/web_contents.h" |
| 27 #include "content/public/browser/zoom_level_delegate.h" |
26 #include "content/public/common/page_type.h" | 28 #include "content/public/common/page_type.h" |
27 #include "content/public/test/browser_test_utils.h" | 29 #include "content/public/test/browser_test_utils.h" |
28 #include "testing/gmock/include/gmock/gmock.h" | 30 #include "testing/gmock/include/gmock/gmock.h" |
29 | 31 |
30 using zoom::ZoomController; | 32 using zoom::ZoomController; |
31 using zoom::ZoomObserver; | 33 using zoom::ZoomObserver; |
32 | 34 |
33 bool operator==(const ZoomController::ZoomChangedEventData& lhs, | 35 bool operator==(const ZoomController::ZoomChangedEventData& lhs, |
34 const ZoomController::ZoomChangedEventData& rhs) { | 36 const ZoomController::ZoomChangedEventData& rhs) { |
35 return lhs.web_contents == rhs.web_contents && | 37 return lhs.web_contents == rhs.web_contents && |
(...skipping 27 matching lines...) Expand all Loading... |
63 scoped_refptr<content::MessageLoopRunner> message_loop_runner_; | 65 scoped_refptr<content::MessageLoopRunner> message_loop_runner_; |
64 | 66 |
65 DISALLOW_COPY_AND_ASSIGN(ZoomChangedWatcher); | 67 DISALLOW_COPY_AND_ASSIGN(ZoomChangedWatcher); |
66 }; | 68 }; |
67 | 69 |
68 class ZoomControllerBrowserTest : public InProcessBrowserTest { | 70 class ZoomControllerBrowserTest : public InProcessBrowserTest { |
69 public: | 71 public: |
70 ZoomControllerBrowserTest() {} | 72 ZoomControllerBrowserTest() {} |
71 ~ZoomControllerBrowserTest() override {} | 73 ~ZoomControllerBrowserTest() override {} |
72 | 74 |
| 75 void SetUpOnMainThread() override { |
| 76 // These tests assume we are per-origin by default. |
| 77 content::WebContents* web_contents = |
| 78 browser()->tab_strip_model()->GetActiveWebContents(); |
| 79 ZoomController* zoom_controller = |
| 80 ZoomController::FromWebContents(web_contents); |
| 81 ASSERT_EQ(ZoomController::ZOOM_MODE_DEFAULT, zoom_controller->zoom_mode()); |
| 82 } |
| 83 |
73 void TestResetOnNavigation(ZoomController::ZoomMode zoom_mode) { | 84 void TestResetOnNavigation(ZoomController::ZoomMode zoom_mode) { |
74 DCHECK(zoom_mode == ZoomController::ZOOM_MODE_ISOLATED || | 85 DCHECK(zoom_mode == ZoomController::ZOOM_MODE_ISOLATED || |
75 zoom_mode == ZoomController::ZOOM_MODE_MANUAL); | 86 zoom_mode == ZoomController::ZOOM_MODE_MANUAL); |
76 content::WebContents* web_contents = | 87 content::WebContents* web_contents = |
77 browser()->tab_strip_model()->GetActiveWebContents(); | 88 browser()->tab_strip_model()->GetActiveWebContents(); |
78 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 89 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
79 browser(), GURL("about:blank"), 1); | 90 browser(), GURL("about:blank"), 1); |
80 ZoomController* zoom_controller = | 91 ZoomController* zoom_controller = |
81 ZoomController::FromWebContents(web_contents); | 92 ZoomController::FromWebContents(web_contents); |
82 double zoom_level = zoom_controller->GetDefaultZoomLevel(); | 93 double zoom_level = zoom_controller->GetDefaultZoomLevel(); |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 web_contents, | 333 web_contents, |
323 old_zoom_level, | 334 old_zoom_level, |
324 new_zoom_level, | 335 new_zoom_level, |
325 ZoomController::ZOOM_MODE_DEFAULT, | 336 ZoomController::ZOOM_MODE_DEFAULT, |
326 true); // We have a non-empty host, so this will be 'true'. | 337 true); // We have a non-empty host, so this will be 'true'. |
327 ZoomChangedWatcher zoom_change_watcher(web_contents, zoom_change_data); | 338 ZoomChangedWatcher zoom_change_watcher(web_contents, zoom_change_data); |
328 zoom_controller->SetZoomLevel(new_zoom_level); | 339 zoom_controller->SetZoomLevel(new_zoom_level); |
329 zoom_change_watcher.Wait(); | 340 zoom_change_watcher.Wait(); |
330 } | 341 } |
331 #endif // !defined(OS_CHROMEOS) | 342 #endif // !defined(OS_CHROMEOS) |
| 343 |
| 344 |
| 345 class ZoomControllerPerTabBrowserTest : public ZoomControllerBrowserTest { |
| 346 public: |
| 347 void SetUpOnMainThread() override { |
| 348 // These tests assume we are per-tab by default. |
| 349 ChromeZoomLevelPrefs* zoom_prefs = |
| 350 browser()->profile()->GetZoomLevelPrefs(); |
| 351 ASSERT_TRUE(zoom_prefs); |
| 352 // TODO It looks like Profile::GetZoomLevelPrefs is to be removed. |
| 353 // Should we just be using the profile's default storage partition |
| 354 // directly? |
| 355 zoom_prefs->SetIsOriginScopePref(false); |
| 356 |
| 357 content::WebContents* web_contents = |
| 358 browser()->tab_strip_model()->GetActiveWebContents(); |
| 359 ZoomController* zoom_controller = |
| 360 ZoomController::FromWebContents(web_contents); |
| 361 // Since this zoom controller was initialized before SetUpOnMainThread() |
| 362 // was called, we need to verify that this zoom controller's mode was |
| 363 // updated when we set the zoom scope preference. |
| 364 ASSERT_EQ(ZoomController::ZOOM_MODE_ISOLATED, zoom_controller->zoom_mode()); |
| 365 } |
| 366 }; // ZoomControllerPerTabBrowserTest |
| 367 |
| 368 IN_PROC_BROWSER_TEST_F(ZoomControllerPerTabBrowserTest, IsolatedZoom) { |
| 369 content::WebContents* web_contents1 = |
| 370 browser()->tab_strip_model()->GetActiveWebContents(); |
| 371 ZoomController* zoom_controller1 = |
| 372 ZoomController::FromWebContents(web_contents1); |
| 373 double old_zoom_level = zoom_controller1->GetZoomLevel(); |
| 374 |
| 375 double new_zoom_level1 = old_zoom_level + 0.5; |
| 376 ZoomController::ZoomChangedEventData zoom_change_data1( |
| 377 web_contents1, |
| 378 old_zoom_level, |
| 379 new_zoom_level1, |
| 380 ZoomController::ZOOM_MODE_ISOLATED, |
| 381 true); |
| 382 ZoomChangedWatcher zoom_change_watcher1(web_contents1, zoom_change_data1); |
| 383 zoom_controller1->SetZoomLevel(new_zoom_level1); |
| 384 zoom_change_watcher1.Wait(); |
| 385 |
| 386 // The new tab should start with the default zoom, and not be affected by |
| 387 // the zoom level set in the other tab. |
| 388 ui_test_utils::NavigateToURLWithDisposition( |
| 389 browser(), GURL("about:blank"), |
| 390 WindowOpenDisposition::NEW_FOREGROUND_TAB, |
| 391 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 392 content::WebContents* web_contents2 = |
| 393 browser()->tab_strip_model()->GetActiveWebContents(); |
| 394 ZoomController* zoom_controller2 = |
| 395 ZoomController::FromWebContents(web_contents2); |
| 396 EXPECT_TRUE(zoom_controller2->IsAtDefaultZoom()); |
| 397 |
| 398 double new_zoom_level2 = old_zoom_level + 1.0; |
| 399 ZoomController::ZoomChangedEventData zoom_change_data2( |
| 400 web_contents2, |
| 401 old_zoom_level, |
| 402 new_zoom_level2, |
| 403 ZoomController::ZOOM_MODE_ISOLATED, |
| 404 true); |
| 405 ZoomChangedWatcher zoom_change_watcher2(web_contents2, zoom_change_data2); |
| 406 zoom_controller2->SetZoomLevel(new_zoom_level2); |
| 407 zoom_change_watcher2.Wait(); |
| 408 |
| 409 // Now when we zoom the second tab, the first should not be affected. |
| 410 EXPECT_TRUE(content::ZoomValuesEqual(new_zoom_level1, |
| 411 zoom_controller1->GetZoomLevel())); |
| 412 } |
| 413 |
| 414 // Since we are zooming on a per-tab basis, the navigation of a tab does not |
| 415 // reset the zoom level. |
| 416 IN_PROC_BROWSER_TEST_F(ZoomControllerPerTabBrowserTest, |
| 417 NavigationPreservesZoom) { |
| 418 ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); |
| 419 content::WebContents* web_contents = |
| 420 browser()->tab_strip_model()->GetActiveWebContents(); |
| 421 ZoomController* zoom_controller = |
| 422 ZoomController::FromWebContents(web_contents); |
| 423 |
| 424 double old_zoom_level = zoom_controller->GetZoomLevel(); |
| 425 double new_zoom_level = old_zoom_level + 0.5; |
| 426 ZoomController::ZoomChangedEventData zoom_change_data( |
| 427 web_contents, |
| 428 old_zoom_level, |
| 429 new_zoom_level, |
| 430 ZoomController::ZOOM_MODE_ISOLATED, |
| 431 true); |
| 432 ZoomChangedWatcher zoom_change_watcher(web_contents, zoom_change_data); |
| 433 zoom_controller->SetZoomLevel(new_zoom_level); |
| 434 zoom_change_watcher.Wait(); |
| 435 |
| 436 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUISettingsURL)); |
| 437 EXPECT_TRUE(content::ZoomValuesEqual(new_zoom_level, |
| 438 zoom_controller->GetZoomLevel())); |
| 439 } |
| 440 |
| 441 // Test that duplicated tabs start with the temporary zoom level of the |
| 442 // original tab. |
| 443 IN_PROC_BROWSER_TEST_F(ZoomControllerPerTabBrowserTest, |
| 444 TabDuplicationPreservesZoom) { |
| 445 TabStripModel* strip = browser()->tab_strip_model(); |
| 446 content::WebContents* web_contents1 = strip->GetActiveWebContents(); |
| 447 ZoomController* zoom_controller1 = |
| 448 ZoomController::FromWebContents(web_contents1); |
| 449 |
| 450 double old_zoom_level = zoom_controller1->GetZoomLevel(); |
| 451 double new_zoom_level = old_zoom_level + 0.5; |
| 452 |
| 453 ZoomController::ZoomChangedEventData zoom_change_data1( |
| 454 web_contents1, |
| 455 old_zoom_level, |
| 456 new_zoom_level, |
| 457 ZoomController::ZOOM_MODE_ISOLATED, |
| 458 true); |
| 459 ZoomChangedWatcher zoom_change_watcher1(web_contents1, zoom_change_data1); |
| 460 zoom_controller1->SetZoomLevel(new_zoom_level); |
| 461 zoom_change_watcher1.Wait(); |
| 462 |
| 463 content::WebContents* web_contents2 = chrome::DuplicateTabAt( |
| 464 browser(), strip->GetIndexOfWebContents(web_contents1)); |
| 465 ZoomController* zoom_controller2 = |
| 466 ZoomController::FromWebContents(web_contents2); |
| 467 |
| 468 EXPECT_TRUE(content::ZoomValuesEqual(new_zoom_level, |
| 469 zoom_controller2->GetZoomLevel())); |
| 470 } |
| 471 |
| 472 // Test that swapping the WebContents for a tab (e.g. due to prerendering) |
| 473 // preserves the temporary zoom level. |
| 474 IN_PROC_BROWSER_TEST_F(ZoomControllerPerTabBrowserTest, |
| 475 TabStripReplacementPreservesZoom) { |
| 476 TabStripModel* strip = browser()->tab_strip_model(); |
| 477 content::WebContents* web_contents1 = strip->GetActiveWebContents(); |
| 478 ZoomController* zoom_controller1 = |
| 479 ZoomController::FromWebContents(web_contents1); |
| 480 |
| 481 // Setup a new WebContents that will be swapped for the old one. |
| 482 std::unique_ptr<content::WebContents> web_contents2(web_contents1->Clone()); |
| 483 ZoomController::CreateForWebContents(web_contents2.get()); |
| 484 |
| 485 double old_zoom_level = zoom_controller1->GetZoomLevel(); |
| 486 double new_zoom_level = old_zoom_level + 0.5; |
| 487 |
| 488 ZoomController::ZoomChangedEventData zoom_change_data1( |
| 489 web_contents1, |
| 490 old_zoom_level, |
| 491 new_zoom_level, |
| 492 ZoomController::ZOOM_MODE_ISOLATED, |
| 493 true); |
| 494 ZoomChangedWatcher zoom_change_watcher1(web_contents1, zoom_change_data1); |
| 495 zoom_controller1->SetZoomLevel(new_zoom_level); |
| 496 zoom_change_watcher1.Wait(); |
| 497 |
| 498 // Verify that the temporary zoom level is set on the new WebContents. |
| 499 ZoomController::ZoomChangedEventData zoom_change_data2( |
| 500 web_contents2.get(), |
| 501 new_zoom_level, |
| 502 new_zoom_level, |
| 503 ZoomController::ZOOM_MODE_ISOLATED, |
| 504 false); |
| 505 ZoomChangedWatcher zoom_change_watcher2(web_contents2.get(), |
| 506 zoom_change_data2); |
| 507 delete strip->ReplaceWebContentsAt( |
| 508 strip->GetIndexOfWebContents(web_contents1), web_contents2.get()); |
| 509 zoom_change_watcher2.Wait(); |
| 510 } |
| 511 |
| 512 // Test that an Incognito profile inherits its parent's default zoom scope and |
| 513 // that changes to the default zoom scope in the parent propogate to the child. |
| 514 IN_PROC_BROWSER_TEST_F(ZoomControllerPerTabBrowserTest, |
| 515 OffTheRecordProfileDefaultZoomScope) { |
| 516 Browser* incognito_browser = CreateIncognitoBrowser(); |
| 517 content::WebContents* web_contents = |
| 518 incognito_browser->tab_strip_model()->GetActiveWebContents(); |
| 519 ZoomController* zoom_controller = |
| 520 ZoomController::FromWebContents(web_contents); |
| 521 content::BrowserContext* context = web_contents->GetBrowserContext(); |
| 522 ASSERT_TRUE(context->IsOffTheRecord()); |
| 523 |
| 524 ChromeZoomLevelPrefs* parent_zoom_prefs = |
| 525 browser()->profile()->GetZoomLevelPrefs(); |
| 526 content::ZoomLevelDelegate* child_zoom_prefs = |
| 527 content::BrowserContext::GetDefaultStoragePartition(context) |
| 528 ->GetZoomLevelDelegate(); |
| 529 ASSERT_TRUE(parent_zoom_prefs); |
| 530 ASSERT_TRUE(child_zoom_prefs); |
| 531 |
| 532 EXPECT_FALSE(child_zoom_prefs->GetIsOriginScopePref()); |
| 533 EXPECT_EQ(ZoomController::ZOOM_MODE_ISOLATED, zoom_controller->zoom_mode()); |
| 534 |
| 535 parent_zoom_prefs->SetIsOriginScopePref(true); |
| 536 |
| 537 EXPECT_TRUE(child_zoom_prefs->GetIsOriginScopePref()); |
| 538 EXPECT_EQ(ZoomController::ZOOM_MODE_DEFAULT, zoom_controller->zoom_mode()); |
| 539 } |
OLD | NEW |