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