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 virtual void SetUpOnMainThread() OVERRIDE {
28 zoom_subscription_ = content::HostZoomMap::GetDefaultForBrowserContext(
29 browser()->profile())->AddZoomLevelChangedCallback(
30 base::Bind(&ZoomDecorationTest::OnZoomChanged,
31 base::Unretained(this)));
34 virtual void TearDownOnMainThread() OVERRIDE {
35 zoom_subscription_.reset();
38 LocationBarViewMac* GetLocationBar() const {
39 BrowserWindowController* controller =
40 [BrowserWindowController browserWindowControllerForWindow:
41 browser()->window()->GetNativeWindow()];
42 return [controller locationBarBridge];
45 ZoomDecoration* GetZoomDecoration() const {
46 return GetLocationBar()->zoom_decoration_.get();
49 ZoomDecoration* GetZoomDecorationForBrowser(Browser* browser) const {
50 BrowserWindowController* controller =
51 [BrowserWindowController browserWindowControllerForWindow:
52 browser->window()->GetNativeWindow()];
53 return [controller locationBarBridge]->zoom_decoration_.get();
56 void Zoom(content::PageZoom zoom) {
57 content::WebContents* web_contents =
58 browser()->tab_strip_model()->GetActiveWebContents();
60 base::AutoReset<bool> reset(&should_quit_on_zoom_, true);
61 chrome_page_zoom::Zoom(web_contents, zoom);
62 content::RunMessageLoop();
65 void OnZoomChanged(const content::HostZoomMap::ZoomLevelChange& host) {
66 if (should_quit_on_zoom_) {
67 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
68 &base::MessageLoop::Quit,
69 base::Unretained(base::MessageLoop::current())));
74 bool should_quit_on_zoom_;
75 scoped_ptr<content::HostZoomMap::Subscription> zoom_subscription_;
77 DISALLOW_COPY_AND_ASSIGN(ZoomDecorationTest);
80 IN_PROC_BROWSER_TEST_F(ZoomDecorationTest, BubbleAtDefaultZoom) {
81 ZoomDecoration* zoom_decoration = GetZoomDecoration();
84 EXPECT_FALSE(zoom_decoration->IsVisible());
85 Zoom(content::PAGE_ZOOM_IN);
86 EXPECT_TRUE(zoom_decoration->IsVisible());
87 Zoom(content::PAGE_ZOOM_RESET);
88 EXPECT_FALSE(zoom_decoration->IsVisible());
90 // Zoom in and show bubble then reset.
91 Zoom(content::PAGE_ZOOM_IN);
92 EXPECT_TRUE(zoom_decoration->IsVisible());
93 zoom_decoration->ShowBubble(false);
94 Zoom(content::PAGE_ZOOM_RESET);
95 EXPECT_TRUE(zoom_decoration->IsVisible());
97 // Hide bubble and verify the decoration is hidden.
98 zoom_decoration->CloseBubble();
99 EXPECT_FALSE(zoom_decoration->IsVisible());
102 IN_PROC_BROWSER_TEST_F(ZoomDecorationTest, HideOnInputProgress) {
103 ZoomDecoration* zoom_decoration = GetZoomDecoration();
105 // Zoom in and reset.
106 Zoom(content::PAGE_ZOOM_IN);
107 EXPECT_TRUE(zoom_decoration->IsVisible());
109 scoped_ptr<ToolbarModel> toolbar_model(new TestToolbarModel);
110 toolbar_model->set_input_in_progress(true);
111 browser()->swap_toolbar_models(&toolbar_model);
112 GetLocationBar()->ZoomChangedForActiveTab(false);
113 EXPECT_FALSE(zoom_decoration->IsVisible());
116 IN_PROC_BROWSER_TEST_F(ZoomDecorationTest, CloseBrowserWithOpenBubble) {
117 chrome::SetZoomBubbleAutoCloseDelayForTesting(0);
119 // Create a new browser so that it can be closed properly.
120 Browser* browser2 = CreateBrowser(browser()->profile());
121 ZoomDecoration* zoom_decoration = GetZoomDecorationForBrowser(browser2);
122 zoom_decoration->ShowBubble(true);
124 // Test shouldn't crash.
125 browser2->window()->Close();
126 content::RunAllPendingInMessageLoop();