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_otr_delegate.h" |
15 #include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h" | 16 #include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h" |
16 #include "chrome/common/url_constants.h" | 17 #include "chrome/common/url_constants.h" |
17 #include "chrome/test/base/in_process_browser_test.h" | 18 #include "chrome/test/base/in_process_browser_test.h" |
18 #include "chrome/test/base/ui_test_utils.h" | 19 #include "chrome/test/base/ui_test_utils.h" |
19 #include "components/prefs/pref_service.h" | 20 #include "components/prefs/pref_service.h" |
20 #include "components/signin/core/common/profile_management_switches.h" | 21 #include "components/signin/core/common/profile_management_switches.h" |
21 #include "content/public/browser/host_zoom_map.h" | 22 #include "content/public/browser/host_zoom_map.h" |
22 #include "content/public/browser/navigation_entry.h" | 23 #include "content/public/browser/navigation_entry.h" |
23 #include "content/public/browser/render_process_host.h" | 24 #include "content/public/browser/render_process_host.h" |
24 #include "content/public/browser/render_view_host.h" | 25 #include "content/public/browser/render_view_host.h" |
| 26 #include "content/public/browser/storage_partition.h" |
25 #include "content/public/browser/web_contents.h" | 27 #include "content/public/browser/web_contents.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) { |
(...skipping 28 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 class ZoomControllerPerTabBrowserTest : public ZoomControllerBrowserTest { |
| 345 public: |
| 346 void SetUpOnMainThread() override { |
| 347 // These tests assume we are per-tab by default. |
| 348 ChromeZoomLevelPrefs* zoom_prefs = |
| 349 browser()->profile()->GetZoomLevelPrefs(); |
| 350 ASSERT_TRUE(zoom_prefs); |
| 351 zoom_prefs->SetZoomScopeIsPerOriginPref(false); |
| 352 |
| 353 content::WebContents* web_contents = |
| 354 browser()->tab_strip_model()->GetActiveWebContents(); |
| 355 ZoomController* zoom_controller = |
| 356 ZoomController::FromWebContents(web_contents); |
| 357 // Since this zoom controller was initialized before SetUpOnMainThread() |
| 358 // was called, we need to verify that this zoom controller's mode was |
| 359 // updated when we set the zoom scope preference. |
| 360 ASSERT_EQ(ZoomController::ZOOM_MODE_ISOLATED, zoom_controller->zoom_mode()); |
| 361 } |
| 362 }; // ZoomControllerPerTabBrowserTest |
| 363 |
| 364 IN_PROC_BROWSER_TEST_F(ZoomControllerPerTabBrowserTest, IsolatedZoom) { |
| 365 content::WebContents* web_contents1 = |
| 366 browser()->tab_strip_model()->GetActiveWebContents(); |
| 367 ZoomController* zoom_controller1 = |
| 368 ZoomController::FromWebContents(web_contents1); |
| 369 double old_zoom_level = zoom_controller1->GetZoomLevel(); |
| 370 |
| 371 double new_zoom_level1 = old_zoom_level + 0.5; |
| 372 ZoomController::ZoomChangedEventData zoom_change_data1( |
| 373 web_contents1, old_zoom_level, new_zoom_level1, |
| 374 ZoomController::ZOOM_MODE_ISOLATED, true); |
| 375 ZoomChangedWatcher zoom_change_watcher1(web_contents1, zoom_change_data1); |
| 376 zoom_controller1->SetZoomLevel(new_zoom_level1); |
| 377 zoom_change_watcher1.Wait(); |
| 378 |
| 379 // The new tab should start with the default zoom, and not be affected by |
| 380 // the zoom level set in the other tab. |
| 381 ui_test_utils::NavigateToURLWithDisposition( |
| 382 browser(), GURL("about:blank"), WindowOpenDisposition::NEW_FOREGROUND_TAB, |
| 383 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| 384 content::WebContents* web_contents2 = |
| 385 browser()->tab_strip_model()->GetActiveWebContents(); |
| 386 ZoomController* zoom_controller2 = |
| 387 ZoomController::FromWebContents(web_contents2); |
| 388 EXPECT_TRUE(zoom_controller2->IsAtDefaultZoom()); |
| 389 |
| 390 double new_zoom_level2 = old_zoom_level + 1.0; |
| 391 ZoomController::ZoomChangedEventData zoom_change_data2( |
| 392 web_contents2, old_zoom_level, new_zoom_level2, |
| 393 ZoomController::ZOOM_MODE_ISOLATED, true); |
| 394 ZoomChangedWatcher zoom_change_watcher2(web_contents2, zoom_change_data2); |
| 395 zoom_controller2->SetZoomLevel(new_zoom_level2); |
| 396 zoom_change_watcher2.Wait(); |
| 397 |
| 398 // Now when we zoom the second tab, the first should not be affected. |
| 399 EXPECT_TRUE(content::ZoomValuesEqual(new_zoom_level1, |
| 400 zoom_controller1->GetZoomLevel())); |
| 401 } |
| 402 |
| 403 // Since we are zooming on a per-tab basis, the navigation of a tab does not |
| 404 // reset the zoom level. |
| 405 IN_PROC_BROWSER_TEST_F(ZoomControllerPerTabBrowserTest, |
| 406 NavigationPreservesZoom) { |
| 407 ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); |
| 408 content::WebContents* web_contents = |
| 409 browser()->tab_strip_model()->GetActiveWebContents(); |
| 410 ZoomController* zoom_controller = |
| 411 ZoomController::FromWebContents(web_contents); |
| 412 |
| 413 double old_zoom_level = zoom_controller->GetZoomLevel(); |
| 414 double new_zoom_level = old_zoom_level + 0.5; |
| 415 ZoomController::ZoomChangedEventData zoom_change_data( |
| 416 web_contents, old_zoom_level, new_zoom_level, |
| 417 ZoomController::ZOOM_MODE_ISOLATED, true); |
| 418 ZoomChangedWatcher zoom_change_watcher(web_contents, zoom_change_data); |
| 419 zoom_controller->SetZoomLevel(new_zoom_level); |
| 420 zoom_change_watcher.Wait(); |
| 421 |
| 422 ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUISettingsURL)); |
| 423 EXPECT_TRUE(content::ZoomValuesEqual(new_zoom_level, |
| 424 zoom_controller->GetZoomLevel())); |
| 425 } |
| 426 |
| 427 // Test that duplicated tabs start with the temporary zoom level of the |
| 428 // original tab. |
| 429 IN_PROC_BROWSER_TEST_F(ZoomControllerPerTabBrowserTest, |
| 430 TabDuplicationPreservesZoom) { |
| 431 TabStripModel* strip = browser()->tab_strip_model(); |
| 432 content::WebContents* web_contents1 = strip->GetActiveWebContents(); |
| 433 ZoomController* zoom_controller1 = |
| 434 ZoomController::FromWebContents(web_contents1); |
| 435 |
| 436 double old_zoom_level = zoom_controller1->GetZoomLevel(); |
| 437 double new_zoom_level = old_zoom_level + 0.5; |
| 438 |
| 439 ZoomController::ZoomChangedEventData zoom_change_data1( |
| 440 web_contents1, old_zoom_level, new_zoom_level, |
| 441 ZoomController::ZOOM_MODE_ISOLATED, true); |
| 442 ZoomChangedWatcher zoom_change_watcher1(web_contents1, zoom_change_data1); |
| 443 zoom_controller1->SetZoomLevel(new_zoom_level); |
| 444 zoom_change_watcher1.Wait(); |
| 445 |
| 446 content::WebContents* web_contents2 = chrome::DuplicateTabAt( |
| 447 browser(), strip->GetIndexOfWebContents(web_contents1)); |
| 448 ZoomController* zoom_controller2 = |
| 449 ZoomController::FromWebContents(web_contents2); |
| 450 |
| 451 EXPECT_TRUE(content::ZoomValuesEqual(new_zoom_level, |
| 452 zoom_controller2->GetZoomLevel())); |
| 453 } |
| 454 |
| 455 // Test that swapping the WebContents for a tab (e.g. due to prerendering) |
| 456 // preserves the temporary zoom level. |
| 457 IN_PROC_BROWSER_TEST_F(ZoomControllerPerTabBrowserTest, |
| 458 TabStripReplacementPreservesZoom) { |
| 459 TabStripModel* strip = browser()->tab_strip_model(); |
| 460 content::WebContents* web_contents1 = strip->GetActiveWebContents(); |
| 461 ZoomController* zoom_controller1 = |
| 462 ZoomController::FromWebContents(web_contents1); |
| 463 |
| 464 // Setup a new WebContents that will be swapped for the old one. |
| 465 std::unique_ptr<content::WebContents> web_contents2(web_contents1->Clone()); |
| 466 ZoomController::CreateForWebContents(web_contents2.get()); |
| 467 |
| 468 double old_zoom_level = zoom_controller1->GetZoomLevel(); |
| 469 double new_zoom_level = old_zoom_level + 0.5; |
| 470 |
| 471 ZoomController::ZoomChangedEventData zoom_change_data1( |
| 472 web_contents1, old_zoom_level, new_zoom_level, |
| 473 ZoomController::ZOOM_MODE_ISOLATED, true); |
| 474 ZoomChangedWatcher zoom_change_watcher1(web_contents1, zoom_change_data1); |
| 475 zoom_controller1->SetZoomLevel(new_zoom_level); |
| 476 zoom_change_watcher1.Wait(); |
| 477 |
| 478 // Verify that the temporary zoom level is set on the new WebContents. |
| 479 ZoomController::ZoomChangedEventData zoom_change_data2( |
| 480 web_contents2.get(), new_zoom_level, new_zoom_level, |
| 481 ZoomController::ZOOM_MODE_ISOLATED, false); |
| 482 ZoomChangedWatcher zoom_change_watcher2(web_contents2.get(), |
| 483 zoom_change_data2); |
| 484 delete strip->ReplaceWebContentsAt( |
| 485 strip->GetIndexOfWebContents(web_contents1), web_contents2.get()); |
| 486 zoom_change_watcher2.Wait(); |
| 487 } |
| 488 |
| 489 // Test that an Incognito profile inherits its parent's default zoom scope and |
| 490 // that changes to the default zoom scope in the parent propogate to the child. |
| 491 IN_PROC_BROWSER_TEST_F(ZoomControllerPerTabBrowserTest, |
| 492 OffTheRecordProfileDefaultZoomScope) { |
| 493 Browser* incognito_browser = CreateIncognitoBrowser(); |
| 494 content::WebContents* web_contents = |
| 495 incognito_browser->tab_strip_model()->GetActiveWebContents(); |
| 496 ZoomController* zoom_controller = |
| 497 ZoomController::FromWebContents(web_contents); |
| 498 content::BrowserContext* context = web_contents->GetBrowserContext(); |
| 499 ASSERT_TRUE(context->IsOffTheRecord()); |
| 500 |
| 501 ChromeZoomLevelPrefs* parent_zoom_prefs = |
| 502 browser()->profile()->GetZoomLevelPrefs(); |
| 503 ChromeZoomLevelOTRDelegate* child_zoom_prefs = |
| 504 static_cast<ChromeZoomLevelOTRDelegate*>( |
| 505 content::BrowserContext::GetDefaultStoragePartition(context) |
| 506 ->GetZoomLevelDelegate()); |
| 507 ASSERT_TRUE(parent_zoom_prefs); |
| 508 ASSERT_TRUE(child_zoom_prefs); |
| 509 |
| 510 EXPECT_FALSE(child_zoom_prefs->GetZoomScopeIsPerOriginPref()); |
| 511 EXPECT_EQ(ZoomController::ZOOM_MODE_ISOLATED, zoom_controller->zoom_mode()); |
| 512 |
| 513 parent_zoom_prefs->SetZoomScopeIsPerOriginPref(true); |
| 514 |
| 515 EXPECT_TRUE(child_zoom_prefs->GetZoomScopeIsPerOriginPref()); |
| 516 EXPECT_EQ(ZoomController::ZOOM_MODE_DEFAULT, zoom_controller->zoom_mode()); |
| 517 } |
OLD | NEW |