Update To 11.40.268.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   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   void TearDownOnMainThread() override { zoom_subscription_.reset(); }
35
36   LocationBarViewMac* GetLocationBar() const {
37     BrowserWindowController* controller =
38         [BrowserWindowController browserWindowControllerForWindow:
39             browser()->window()->GetNativeWindow()];
40     return [controller locationBarBridge];
41   }
42
43   ZoomDecoration* GetZoomDecoration() const {
44     return GetLocationBar()->zoom_decoration_.get();
45   }
46
47   ZoomDecoration* GetZoomDecorationForBrowser(Browser* browser) const {
48     BrowserWindowController* controller =
49         [BrowserWindowController browserWindowControllerForWindow:
50             browser->window()->GetNativeWindow()];
51     return [controller locationBarBridge]->zoom_decoration_.get();
52   }
53
54   void Zoom(content::PageZoom zoom) {
55     content::WebContents* web_contents =
56         browser()->tab_strip_model()->GetActiveWebContents();
57
58     base::AutoReset<bool> reset(&should_quit_on_zoom_, true);
59     chrome_page_zoom::Zoom(web_contents, zoom);
60     content::RunMessageLoop();
61   }
62
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())));
68     }
69   }
70
71  private:
72   bool should_quit_on_zoom_;
73   scoped_ptr<content::HostZoomMap::Subscription> zoom_subscription_;
74
75   DISALLOW_COPY_AND_ASSIGN(ZoomDecorationTest);
76 };
77
78 IN_PROC_BROWSER_TEST_F(ZoomDecorationTest, BubbleAtDefaultZoom) {
79   ZoomDecoration* zoom_decoration = GetZoomDecoration();
80
81   // Zoom in and reset.
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());
87
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());
94
95   // Hide bubble and verify the decoration is hidden.
96   zoom_decoration->CloseBubble();
97   EXPECT_FALSE(zoom_decoration->IsVisible());
98 }
99
100 IN_PROC_BROWSER_TEST_F(ZoomDecorationTest, HideOnInputProgress) {
101   ZoomDecoration* zoom_decoration = GetZoomDecoration();
102
103   // Zoom in and reset.
104   Zoom(content::PAGE_ZOOM_IN);
105   EXPECT_TRUE(zoom_decoration->IsVisible());
106
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());
112 }
113
114 IN_PROC_BROWSER_TEST_F(ZoomDecorationTest, CloseBrowserWithOpenBubble) {
115   chrome::SetZoomBubbleAutoCloseDelayForTesting(0);
116
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);
121
122   // Test shouldn't crash.
123   browser2->window()->Close();
124   content::RunAllPendingInMessageLoop();
125 }