| Index: chrome/browser/ui/zoom/zoom_controller_unittest.cc
|
| diff --git a/chrome/browser/ui/zoom/zoom_controller_unittest.cc b/chrome/browser/ui/zoom/zoom_controller_unittest.cc
|
| index 835867d5817b4e09ed56a54c97a960a27c790fd1..deab9ab3b27e36663b8d63d786ee12eaee9daa17 100644
|
| --- a/chrome/browser/ui/zoom/zoom_controller_unittest.cc
|
| +++ b/chrome/browser/ui/zoom/zoom_controller_unittest.cc
|
| @@ -2,17 +2,20 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include "components/zoom/zoom_controller.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "chrome/browser/ui/browser.h"
|
| #include "chrome/browser/ui/browser_finder.h"
|
| +#include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h"
|
| #include "chrome/test/base/chrome_render_view_host_test_harness.h"
|
| #include "chrome/test/base/testing_profile.h"
|
| #include "components/prefs/pref_service.h"
|
| #include "components/zoom/test/zoom_test_utils.h"
|
| -#include "components/zoom/zoom_controller.h"
|
| #include "components/zoom/zoom_observer.h"
|
| #include "content/public/browser/host_zoom_map.h"
|
| #include "content/public/browser/navigation_handle.h"
|
| +#include "content/public/browser/storage_partition.h"
|
| +#include "content/public/test/mock_render_process_host.h"
|
| #include "content/public/test/test_renderer_host.h"
|
| #include "content/public/test/test_utils.h"
|
| #include "ipc/ipc_message.h"
|
| @@ -26,6 +29,18 @@ class ZoomControllerTest : public ChromeRenderViewHostTestHarness {
|
| public:
|
| void SetUp() override {
|
| ChromeRenderViewHostTestHarness::SetUp();
|
| +
|
| + // We set the correct zoom scope pref before creating the ZoomController,
|
| + // so we can test without relying on the updating of the ZoomController's
|
| + // state in response to a scope change. We have specific tests for that
|
| + // logic (see OnDefaultZoomScopeChanged).
|
| + ChromeZoomLevelPrefs* zoom_prefs = static_cast<ChromeZoomLevelPrefs*>(
|
| + content::BrowserContext::GetDefaultStoragePartition(
|
| + web_contents()->GetBrowserContext())
|
| + ->GetZoomLevelDelegate());
|
| + ASSERT_TRUE(zoom_prefs);
|
| + SetUpPrefs(zoom_prefs);
|
| +
|
| zoom_controller_.reset(new ZoomController(web_contents()));
|
|
|
| // This call is needed so that the RenderViewHost reports being alive. This
|
| @@ -34,6 +49,11 @@ class ZoomControllerTest : public ChromeRenderViewHostTestHarness {
|
| base::string16(), MSG_ROUTING_NONE, MSG_ROUTING_NONE, false);
|
| }
|
|
|
| + virtual void SetUpPrefs(ChromeZoomLevelPrefs* zoom_prefs) {
|
| + // These tests assume we are per-origin by default.
|
| + ASSERT_TRUE(zoom_prefs->GetZoomScopeIsPerOriginPref());
|
| + }
|
| +
|
| void TearDown() override {
|
| zoom_controller_.reset();
|
| ChromeRenderViewHostTestHarness::TearDown();
|
| @@ -132,3 +152,176 @@ TEST_F(ZoomControllerTest, ObserveManualZoomCanShowBubble) {
|
| }
|
|
|
| }
|
| +
|
| +TEST_F(ZoomControllerTest, OnDefaultZoomScopeChanged) {
|
| + NavigateAndCommit(GURL("about:blank"));
|
| + double old_zoom_level = zoom_controller_->GetZoomLevel();
|
| + double new_zoom_level = old_zoom_level + 1.0;
|
| +
|
| + ZoomController::ZoomChangedEventData zoom_change_data1(
|
| + web_contents(), old_zoom_level, new_zoom_level,
|
| + ZoomController::ZOOM_MODE_DEFAULT, true /* can_show_bubble */);
|
| + {
|
| + ZoomChangedWatcher zoom_change_watcher1(zoom_controller_.get(),
|
| + zoom_change_data1);
|
| + zoom_controller_->SetZoomLevel(new_zoom_level);
|
| + zoom_change_watcher1.Wait();
|
| + }
|
| +
|
| + // When changing the default scope from per-origin to per-tab,
|
| + // update the zoom mode from ZOOM_MODE_DEFAULT to ZOOM_MODE_ISOLATED
|
| + // and keep the previous host zoom level as a temporary level.
|
| + ZoomController::ZoomChangedEventData zoom_change_data2(
|
| + web_contents(), new_zoom_level, new_zoom_level,
|
| + ZoomController::ZOOM_MODE_ISOLATED, true /* can_show_bubble */);
|
| + {
|
| + ZoomChangedWatcher zoom_change_watcher2(zoom_controller_.get(),
|
| + zoom_change_data2);
|
| + zoom_controller_->OnDefaultZoomScopeChanged();
|
| + zoom_change_watcher2.Wait();
|
| +
|
| + content::HostZoomMap* zoom_map =
|
| + content::HostZoomMap::GetForWebContents(web_contents());
|
| + EXPECT_TRUE(zoom_map->UsesTemporaryZoomLevel(process()->GetID(),
|
| + rvh()->GetRoutingID()));
|
| + }
|
| +}
|
| +
|
| +class ZoomControllerPerTabTest : public ZoomControllerTest {
|
| + public:
|
| + void SetUpPrefs(ChromeZoomLevelPrefs* zoom_prefs) override {
|
| + // These tests assume we are per-tab by default.
|
| + zoom_prefs->SetZoomScopeIsPerOriginPref(false);
|
| + }
|
| +
|
| + void TestResetOnNavigation(ZoomController::ZoomMode zoom_mode) {
|
| + DCHECK(zoom_mode == ZoomController::ZOOM_MODE_DEFAULT ||
|
| + zoom_mode == ZoomController::ZOOM_MODE_MANUAL);
|
| + NavigateAndCommit(GURL("about:blank"));
|
| +
|
| + double old_zoom_level = zoom_controller_->GetZoomLevel();
|
| + double new_zoom_level = old_zoom_level + 1.0;
|
| +
|
| + zoom_controller_->SetZoomMode(zoom_mode);
|
| + ZoomController::ZoomChangedEventData zoom_change_data1(
|
| + web_contents(), old_zoom_level, new_zoom_level, zoom_mode,
|
| + true /* can_show_bubble */);
|
| + {
|
| + ZoomChangedWatcher zoom_change_watcher1(zoom_controller_.get(),
|
| + zoom_change_data1);
|
| + zoom_controller_->SetZoomLevel(new_zoom_level);
|
| + zoom_change_watcher1.Wait();
|
| + }
|
| +
|
| + // Zoom level and mode are reset.
|
| + ZoomController::ZoomChangedEventData zoom_change_data2(
|
| + web_contents(), old_zoom_level, old_zoom_level,
|
| + ZoomController::ZOOM_MODE_ISOLATED, false /* can_show_bubble */);
|
| + {
|
| + ZoomChangedWatcher zoom_change_watcher2(zoom_controller_.get(),
|
| + zoom_change_data2);
|
| + std::unique_ptr<content::NavigationHandle> navigation_handle =
|
| + content::NavigationHandle::CreateNavigationHandleForTesting(
|
| + GURL(), rvh()->GetMainFrame(), true);
|
| + zoom_controller_->DidFinishNavigation(navigation_handle.get());
|
| + zoom_change_watcher2.Wait();
|
| +
|
| + // Since we're in ZOOM_MODE_ISOLATED, we need a temporary zoom level.
|
| + // The reset should update the temporary zoom level, not clear it.
|
| + content::HostZoomMap* zoom_map =
|
| + content::HostZoomMap::GetForWebContents(web_contents());
|
| + EXPECT_TRUE(zoom_map->UsesTemporaryZoomLevel(process()->GetID(),
|
| + rvh()->GetRoutingID()));
|
| + }
|
| + }
|
| +};
|
| +
|
| +TEST_F(ZoomControllerPerTabTest, InitializedState) {
|
| + EXPECT_EQ(ZoomController::ZOOM_MODE_ISOLATED, zoom_controller_->zoom_mode());
|
| +
|
| + // Since we're in ZOOM_MODE_ISOLATED, we need a temporary zoom level.
|
| + content::HostZoomMap* zoom_map =
|
| + content::HostZoomMap::GetForWebContents(web_contents());
|
| + EXPECT_TRUE(zoom_map->UsesTemporaryZoomLevel(process()->GetID(),
|
| + rvh()->GetRoutingID()));
|
| +}
|
| +
|
| +TEST_F(ZoomControllerPerTabTest, DidFinishNavigation) {
|
| + double zoom_level = zoom_controller_->GetZoomLevel();
|
| + ZoomController::ZoomChangedEventData zoom_change_data(
|
| + web_contents(), zoom_level, zoom_level,
|
| + ZoomController::ZOOM_MODE_ISOLATED, false);
|
| + ZoomChangedWatcher zoom_change_watcher(zoom_controller_.get(),
|
| + zoom_change_data);
|
| + std::unique_ptr<content::NavigationHandle> navigation_handle =
|
| + content::NavigationHandle::CreateNavigationHandleForTesting(
|
| + GURL(), rvh()->GetMainFrame(), true);
|
| + zoom_controller_->DidFinishNavigation(navigation_handle.get());
|
| + zoom_change_watcher.Wait();
|
| +}
|
| +
|
| +TEST_F(ZoomControllerPerTabTest, Observe_ZoomController) {
|
| + NavigateAndCommit(GURL("about:blank"));
|
| +
|
| + double old_zoom_level = zoom_controller_->GetZoomLevel();
|
| + double new_zoom_level = old_zoom_level + 1.0;
|
| +
|
| + ZoomController::ZoomChangedEventData zoom_change_data(
|
| + web_contents(), old_zoom_level, new_zoom_level,
|
| + ZoomController::ZOOM_MODE_ISOLATED, true /* can_show_bubble */);
|
| +
|
| + ZoomChangedWatcher zoom_change_watcher(zoom_controller_.get(),
|
| + zoom_change_data);
|
| + zoom_controller_->SetZoomLevel(new_zoom_level);
|
| + zoom_change_watcher.Wait();
|
| +}
|
| +
|
| +TEST_F(ZoomControllerPerTabTest, NavigationFromIsolated) {
|
| + double old_zoom_level = zoom_controller_->GetZoomLevel();
|
| + double new_zoom_level = old_zoom_level + 1.0;
|
| +
|
| + zoom_controller_->SetZoomLevel(new_zoom_level);
|
| +
|
| + // Zoom level and mode are preserved across navigation.
|
| + ZoomController::ZoomChangedEventData zoom_change_data(
|
| + web_contents(), new_zoom_level, new_zoom_level,
|
| + ZoomController::ZOOM_MODE_ISOLATED, false /* can_show_bubble */);
|
| + ZoomChangedWatcher zoom_change_watcher(zoom_controller_.get(),
|
| + zoom_change_data);
|
| + std::unique_ptr<content::NavigationHandle> navigation_handle =
|
| + content::NavigationHandle::CreateNavigationHandleForTesting(
|
| + GURL(), rvh()->GetMainFrame(), true);
|
| + zoom_controller_->DidFinishNavigation(navigation_handle.get());
|
| + zoom_change_watcher.Wait();
|
| +}
|
| +
|
| +TEST_F(ZoomControllerPerTabTest, ResetFromOriginOnNavigation) {
|
| + TestResetOnNavigation(ZoomController::ZOOM_MODE_DEFAULT);
|
| +}
|
| +
|
| +TEST_F(ZoomControllerPerTabTest, ResetFromManualOnNavigation) {
|
| + TestResetOnNavigation(ZoomController::ZOOM_MODE_MANUAL);
|
| +}
|
| +
|
| +TEST_F(ZoomControllerPerTabTest, OnDefaultZoomScopeChanged) {
|
| + NavigateAndCommit(GURL("about:blank"));
|
| + double zoom_level = zoom_controller_->GetZoomLevel();
|
| +
|
| + // When changing the default scope from per-tab to per-origin,
|
| + // update the zoom mode from ZOOM_MODE_ISOLATED to ZOOM_MODE_DEFAULT
|
| + // and remove the temporary level.
|
| + ZoomController::ZoomChangedEventData zoom_change_data(
|
| + web_contents(), zoom_level, zoom_level, ZoomController::ZOOM_MODE_DEFAULT,
|
| + true /* can_show_bubble */);
|
| + {
|
| + ZoomChangedWatcher zoom_change_watcher(zoom_controller_.get(),
|
| + zoom_change_data);
|
| + zoom_controller_->OnDefaultZoomScopeChanged();
|
| + zoom_change_watcher.Wait();
|
| +
|
| + content::HostZoomMap* zoom_map =
|
| + content::HostZoomMap::GetForWebContents(web_contents());
|
| + EXPECT_FALSE(zoom_map->UsesTemporaryZoomLevel(process()->GetID(),
|
| + rvh()->GetRoutingID()));
|
| + }
|
| +}
|
|
|