103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file.
403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/ui/zoom/zoom_controller.h"
603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/prefs/pref_service.h"
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/process/kill.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/profiles/profile.h"
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/pref_names.h"
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/navigation_entry.h"
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/render_view_host.h"
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/browser/web_contents.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/common/page_type.h"
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gmock/include/gmock/gmock.h"
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)typedef InProcessBrowserTest ZoomControllerBrowserTest;
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool operator==(const ZoomController::ZoomChangedEventData& lhs,
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const ZoomController::ZoomChangedEventData& rhs) {
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return lhs.web_contents == rhs.web_contents &&
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         lhs.old_zoom_level == rhs.old_zoom_level &&
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         lhs.new_zoom_level == rhs.new_zoom_level &&
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         lhs.zoom_mode == rhs.zoom_mode &&
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         lhs.can_show_bubble == rhs.can_show_bubble;
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ZoomChangedWatcher : public ZoomObserver {
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ZoomChangedWatcher(
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::WebContents* web_contents,
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const ZoomController::ZoomChangedEventData& expected_event_data)
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : web_contents_(web_contents),
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        expected_event_data_(expected_event_data),
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        message_loop_runner_(new content::MessageLoopRunner) {
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ZoomController::FromWebContents(web_contents)->AddObserver(this);
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~ZoomChangedWatcher() {}
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void Wait() { message_loop_runner_->Run(); }
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnZoomChanged(
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const ZoomController::ZoomChangedEventData& event_data) OVERRIDE {
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (event_data == expected_event_data_)
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      message_loop_runner_->Quit();
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::WebContents* web_contents_;
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ZoomController::ZoomChangedEventData expected_event_data_;
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(ZoomChangedWatcher);
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// TODO(wjmaclean): Enable this on Android when we can kill the process there.
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if defined(OS_ANDROID)
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#define MAYBE_CrashedTabsDoNotChangeZoom DISABLED_CrashedTabsDoNotChangeZoom
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#else
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#define MAYBE_CrashedTabsDoNotChangeZoom CrashedTabsDoNotChangeZoom
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ZoomControllerBrowserTest,
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                       MAYBE_CrashedTabsDoNotChangeZoom) {
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // At the start of the test we are at a tab displaying about:blank.
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::WebContents* web_contents =
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ZoomController* zoom_controller =
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      ZoomController::FromWebContents(web_contents);
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  double old_zoom_level = zoom_controller->GetZoomLevel();
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  double new_zoom_level = old_zoom_level + 0.5;
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::RenderProcessHost* host = web_contents->GetRenderProcessHost();
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    content::RenderProcessHostWatcher crash_observer(
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        host, content::RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    base::KillProcess(host->GetHandle(), 0, false);
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    crash_observer.Wait();
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(web_contents->GetRenderViewHost()->IsRenderViewLive());
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // The following attempt to change the zoom level for a crashed tab should
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // fail.
9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  zoom_controller->SetZoomLevel(new_zoom_level);
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FLOAT_EQ(old_zoom_level, zoom_controller->GetZoomLevel());
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(ZoomControllerBrowserTest, OnPreferenceChanged) {
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::WebContents* web_contents =
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      browser()->tab_strip_model()->GetActiveWebContents();
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  double new_default_zoom_level = 1.0;
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Since this page uses the default zoom level, the changes to the default
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // zoom level will change the zoom level for this web_contents.
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ZoomController::ZoomChangedEventData zoom_change_data(
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      web_contents,
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_default_zoom_level,
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new_default_zoom_level,
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ZoomController::ZOOM_MODE_DEFAULT,
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      true);
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ZoomChangedWatcher zoom_change_watcher(web_contents, zoom_change_data);
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(wjmaclean): Convert this to call partition-specific zoom level prefs
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // when they become available.
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  browser()->profile()->GetPrefs()->SetDouble(prefs::kDefaultZoomLevel,
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              new_default_zoom_level);
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Because this test relies on a round-trip IPC to/from the renderer process,
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // we need to wait for it to propagate.
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  zoom_change_watcher.Wait();
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(ZoomControllerBrowserTest, ErrorPagesDoNotZoom) {
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui_test_utils::NavigateToURL(browser(), GURL("http://kjfhkjsdf.com"));
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::WebContents* web_contents =
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      browser()->tab_strip_model()->GetActiveWebContents();
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ZoomController* zoom_controller =
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ZoomController::FromWebContents(web_contents);
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::PAGE_TYPE_ERROR,
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      web_contents->GetController().GetLastCommittedEntry()->GetPageType());
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  double old_zoom_level = zoom_controller->GetZoomLevel();
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  double new_zoom_level = old_zoom_level + 0.5;
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The following attempt to change the zoom level for an error page should
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // fail.
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  zoom_controller->SetZoomLevel(new_zoom_level);
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FLOAT_EQ(old_zoom_level, zoom_controller->GetZoomLevel());
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
136