Commit 96fc2e9e authored by wjmaclean's avatar wjmaclean Committed by Commit bot

Reset manual zoom mode on navigation.

When an app/extension places a ZoomController in manual mode, it is
reasonable to expect that navigating the main frame should reset that
mode, since the app/extension will be reloaded in the process.

The root cause of this bug was the sending of a ZoomChangeEvent that
contained stale information (the old, manually managed, zoom level),
which in turn caused the zoom bubble to be displayed.

BUG=450909

Review URL: https://codereview.chromium.org/884063004

Cr-Commit-Position: refs/heads/master@{#313576}
parent 5b6eddeb
......@@ -64,7 +64,35 @@ class ZoomChangedWatcher : public ZoomObserver {
DISALLOW_COPY_AND_ASSIGN(ZoomChangedWatcher);
};
typedef InProcessBrowserTest ZoomControllerBrowserTest;
class ZoomControllerBrowserTest : public InProcessBrowserTest {
public:
ZoomControllerBrowserTest() {}
~ZoomControllerBrowserTest() override {}
void TestResetOnNavigation(ZoomController::ZoomMode zoom_mode) {
DCHECK(zoom_mode == ZoomController::ZOOM_MODE_ISOLATED ||
zoom_mode == ZoomController::ZOOM_MODE_MANUAL);
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
browser(), GURL("about:blank"), 1);
ZoomController* zoom_controller =
ZoomController::FromWebContents(web_contents);
double zoom_level = zoom_controller->GetDefaultZoomLevel();
zoom_controller->SetZoomMode(zoom_mode);
// When the navigation occurs, the zoom_mode will be reset to
// ZOOM_MODE_DEFAULT, and this will be reflected in the event that
// is generated.
ZoomController::ZoomChangedEventData zoom_change_data(
web_contents, zoom_level, zoom_level, ZoomController::ZOOM_MODE_DEFAULT,
false);
ZoomChangedWatcher zoom_change_watcher(web_contents, zoom_change_data);
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUISettingsURL));
zoom_change_watcher.Wait();
}
}; // ZoomControllerBrowserTest
#if defined(OS_ANDROID)
#define MAYBE_CrashedTabsDoNotChangeZoom DISABLED_CrashedTabsDoNotChangeZoom
......@@ -164,25 +192,12 @@ IN_PROC_BROWSER_TEST_F(ZoomControllerBrowserTest, Observe) {
}
IN_PROC_BROWSER_TEST_F(ZoomControllerBrowserTest, PerTabModeResetSendsEvent) {
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
browser(), GURL("about:blank"), 1);
ZoomController* zoom_controller =
ZoomController::FromWebContents(web_contents);
double zoom_level = zoom_controller->GetDefaultZoomLevel();
zoom_controller->SetZoomMode(ZoomController::ZOOM_MODE_ISOLATED);
// When the navigation occurs, the ZOOM_MODE_ISOLATED will be reset to
// ZOOM_MODE_DEFAULT, and this will be reflected in the event that
// is generated.
ZoomController::ZoomChangedEventData zoom_change_data(
web_contents, zoom_level, zoom_level, ZoomController::ZOOM_MODE_DEFAULT,
false);
ZoomChangedWatcher zoom_change_watcher(web_contents, zoom_change_data);
TestResetOnNavigation(ZoomController::ZOOM_MODE_ISOLATED);
}
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUISettingsURL));
zoom_change_watcher.Wait();
// Regression test: crbug.com/450909.
IN_PROC_BROWSER_TEST_F(ZoomControllerBrowserTest, NavigationResetsManualMode) {
TestResetOnNavigation(ZoomController::ZOOM_MODE_MANUAL);
}
#if !defined(OS_CHROMEOS)
......
......@@ -236,13 +236,14 @@ void ZoomController::SetZoomMode(ZoomMode new_mode) {
}
void ZoomController::ResetZoomModeOnNavigationIfNeeded(const GURL& url) {
if (zoom_mode_ != ZOOM_MODE_ISOLATED)
if (zoom_mode_ != ZOOM_MODE_ISOLATED && zoom_mode_ != ZOOM_MODE_MANUAL)
return;
int render_process_id = web_contents()->GetRenderProcessHost()->GetID();
int render_view_id = web_contents()->GetRenderViewHost()->GetRoutingID();
content::HostZoomMap* zoom_map =
content::HostZoomMap::GetForWebContents(web_contents());
zoom_level_ = zoom_map->GetDefaultZoomLevel();
double old_zoom_level = zoom_map->GetZoomLevel(web_contents());
double new_zoom_level = zoom_map->GetZoomLevelForHostAndScheme(
url.scheme(), net::GetHostOrSpecFromURL(url));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment