1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/auto_reset.h"
6 #include "chrome/browser/chrome_page_zoom.h"
7 #include "chrome/browser/profiles/profile.h"
8 #include "chrome/browser/ui/browser_window.h"
9 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
10 #import "chrome/browser/ui/cocoa/browser/zoom_bubble_controller.h"
11 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h"
12 #import "chrome/browser/ui/cocoa/location_bar/zoom_decoration.h"
13 #include "chrome/browser/ui/cocoa/run_loop_testing.h"
14 #include "chrome/browser/ui/tabs/tab_strip_model.h"
15 #include "chrome/browser/ui/toolbar/test_toolbar_model.h"
16 #include "chrome/test/base/in_process_browser_test.h"
17 #include "content/public/browser/host_zoom_map.h"
18 #include "content/public/test/test_utils.h"
20 class ZoomDecorationTest : public InProcessBrowserTest {
23 : InProcessBrowserTest(),
24 should_quit_on_zoom_(false) {
27 void SetUpOnMainThread() override {
28 zoom_subscription_ = content::HostZoomMap::GetDefaultForBrowserContext(
29 browser()->profile())->AddZoomLevelChangedCallback(
30 base::Bind(&ZoomDecorationTest::OnZoomChanged,
31 base::Unretained(this)));
34 void TearDownOnMainThread() override { zoom_subscription_.reset(); }
36 LocationBarViewMac* GetLocationBar() const {
37 BrowserWindowController* controller =
38 [BrowserWindowController browserWindowControllerForWindow:
39 browser()->window()->GetNativeWindow()];
40 return [controller locationBarBridge];
43 ZoomDecoration* GetZoomDecoration() const {
44 return GetLocationBar()->zoom_decoration_.get();
47 ZoomDecoration* GetZoomDecorationForBrowser(Browser* browser) const {
48 BrowserWindowController* controller =
49 [BrowserWindowController browserWindowControllerForWindow:
50 browser->window()->GetNativeWindow()];
51 return [controller locationBarBridge]->zoom_decoration_.get();
54 void Zoom(content::PageZoom zoom) {
55 content::WebContents* web_contents =
56 browser()->tab_strip_model()->GetActiveWebContents();
58 base::AutoReset<bool> reset(&should_quit_on_zoom_, true);
59 chrome_page_zoom::Zoom(web_contents, zoom);
60 content::RunMessageLoop();
63 void OnZoomChanged(const content::HostZoomMap::ZoomLevelChange& host) {
64 if (should_quit_on_zoom_) {
65 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
66 &base::MessageLoop::Quit,
67 base::Unretained(base::MessageLoop::current())));
72 bool should_quit_on_zoom_;
73 scoped_ptr<content::HostZoomMap::Subscription> zoom_subscription_;
75 DISALLOW_COPY_AND_ASSIGN(ZoomDecorationTest);
78 IN_PROC_BROWSER_TEST_F(ZoomDecorationTest, BubbleAtDefaultZoom) {
79 ZoomDecoration* zoom_decoration = GetZoomDecoration();
82 EXPECT_FALSE(zoom_decoration->IsVisible());
83 Zoom(content::PAGE_ZOOM_IN);
84 EXPECT_TRUE(zoom_decoration->IsVisible());
85 Zoom(content::PAGE_ZOOM_RESET);
86 EXPECT_FALSE(zoom_decoration->IsVisible());
88 // Zoom in and show bubble then reset.
89 Zoom(content::PAGE_ZOOM_IN);
90 EXPECT_TRUE(zoom_decoration->IsVisible());
91 zoom_decoration->ShowBubble(false);
92 Zoom(content::PAGE_ZOOM_RESET);
93 EXPECT_TRUE(zoom_decoration->IsVisible());
95 // Hide bubble and verify the decoration is hidden.
96 zoom_decoration->CloseBubble();
97 EXPECT_FALSE(zoom_decoration->IsVisible());
100 IN_PROC_BROWSER_TEST_F(ZoomDecorationTest, HideOnInputProgress) {
101 ZoomDecoration* zoom_decoration = GetZoomDecoration();
103 // Zoom in and reset.
104 Zoom(content::PAGE_ZOOM_IN);
105 EXPECT_TRUE(zoom_decoration->IsVisible());
107 scoped_ptr<ToolbarModel> toolbar_model(new TestToolbarModel);
108 toolbar_model->set_input_in_progress(true);
109 browser()->swap_toolbar_models(&toolbar_model);
110 GetLocationBar()->ZoomChangedForActiveTab(false);
111 EXPECT_FALSE(zoom_decoration->IsVisible());
114 IN_PROC_BROWSER_TEST_F(ZoomDecorationTest, CloseBrowserWithOpenBubble) {
115 chrome::SetZoomBubbleAutoCloseDelayForTesting(0);
117 // Create a new browser so that it can be closed properly.
118 Browser* browser2 = CreateBrowser(browser()->profile());
119 ZoomDecoration* zoom_decoration = GetZoomDecorationForBrowser(browser2);
120 zoom_decoration->ShowBubble(true);
122 // Test shouldn't crash.
123 browser2->window()->Close();
124 content::RunAllPendingInMessageLoop();