Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / cocoa / location_bar / zoom_decoration_browsertest.mm
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.
4
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"
19
20 class ZoomDecorationTest : public InProcessBrowserTest {
21  protected:
22   ZoomDecorationTest()
23       : InProcessBrowserTest(),
24         should_quit_on_zoom_(false) {
25   }
26
27   virtual void SetUpOnMainThread() OVERRIDE {
28     zoom_subscription_ = content::HostZoomMap::GetDefaultForBrowserContext(
29         browser()->profile())->AddZoomLevelChangedCallback(
30             base::Bind(&ZoomDecorationTest::OnZoomChanged,
31                        base::Unretained(this)));
32   }
33
34   virtual void TearDownOnMainThread() OVERRIDE {
35     zoom_subscription_.reset();
36   }
37
38   LocationBarViewMac* GetLocationBar() const {
39     BrowserWindowController* controller =
40         [BrowserWindowController browserWindowControllerForWindow:
41             browser()->window()->GetNativeWindow()];
42     return [controller locationBarBridge];
43   }
44
45   ZoomDecoration* GetZoomDecoration() const {
46     return GetLocationBar()->zoom_decoration_.get();
47   }
48
49   ZoomDecoration* GetZoomDecorationForBrowser(Browser* browser) const {
50     BrowserWindowController* controller =
51         [BrowserWindowController browserWindowControllerForWindow:
52             browser->window()->GetNativeWindow()];
53     return [controller locationBarBridge]->zoom_decoration_.get();
54   }
55
56   void Zoom(content::PageZoom zoom) {
57     content::WebContents* web_contents =
58         browser()->tab_strip_model()->GetActiveWebContents();
59
60     base::AutoReset<bool> reset(&should_quit_on_zoom_, true);
61     chrome_page_zoom::Zoom(web_contents, zoom);
62     content::RunMessageLoop();
63   }
64
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())));
70     }
71   }
72
73  private:
74   bool should_quit_on_zoom_;
75   scoped_ptr<content::HostZoomMap::Subscription> zoom_subscription_;
76
77   DISALLOW_COPY_AND_ASSIGN(ZoomDecorationTest);
78 };
79
80 IN_PROC_BROWSER_TEST_F(ZoomDecorationTest, BubbleAtDefaultZoom) {
81   ZoomDecoration* zoom_decoration = GetZoomDecoration();
82
83   // Zoom in and reset.
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());
89
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());
96
97   // Hide bubble and verify the decoration is hidden.
98   zoom_decoration->CloseBubble();
99   EXPECT_FALSE(zoom_decoration->IsVisible());
100 }
101
102 IN_PROC_BROWSER_TEST_F(ZoomDecorationTest, HideOnInputProgress) {
103   ZoomDecoration* zoom_decoration = GetZoomDecoration();
104
105   // Zoom in and reset.
106   Zoom(content::PAGE_ZOOM_IN);
107   EXPECT_TRUE(zoom_decoration->IsVisible());
108
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());
114 }
115
116 IN_PROC_BROWSER_TEST_F(ZoomDecorationTest, CloseBrowserWithOpenBubble) {
117   chrome::SetZoomBubbleAutoCloseDelayForTesting(0);
118
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);
123
124   // Test shouldn't crash.
125   browser2->window()->Close();
126   content::RunAllPendingInMessageLoop();
127 }