Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / chrome / browser / ui / cocoa / extensions / browser_action_test_util_mac.mm
blob322fbf67e73c7225ec15caf39649c5d1da539c33
1 // Copyright (c) 2009 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 "chrome/browser/extensions/browser_action_test_util.h"
7 #include "base/mac/bundle_locations.h"
8 #include "base/mac/foundation_util.h"
9 #include "base/path_service.h"
10 #include "base/strings/sys_string_conversions.h"
11 #include "chrome/browser/ui/browser.h"
12 #import "chrome/browser/ui/cocoa/browser_window_cocoa.h"
13 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
14 #import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
15 #import "chrome/browser/ui/cocoa/extensions/browser_action_button.h"
16 #import "chrome/browser/ui/cocoa/extensions/browser_actions_container_view.h"
17 #import "chrome/browser/ui/cocoa/extensions/browser_actions_controller.h"
18 #import "chrome/browser/ui/cocoa/extensions/extension_popup_controller.h"
19 #import "chrome/browser/ui/cocoa/info_bubble_window.h"
20 #import "chrome/browser/ui/cocoa/themed_window.h"
21 #import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h"
22 #include "chrome/browser/ui/toolbar/toolbar_action_view_controller.h"
23 #include "chrome/browser/ui/toolbar/toolbar_actions_bar.h"
24 #include "chrome/common/chrome_constants.h"
25 #include "grit/theme_resources.h"
26 #include "ui/base/theme_provider.h"
27 #include "ui/gfx/geometry/rect.h"
28 #include "ui/gfx/geometry/size.h"
30 namespace {
32 // The Cocoa implementation of the TestToolbarActionsBarHelper, which creates
33 // (and owns) a BrowserActionsController and BrowserActionsContainerView for
34 // testing purposes.
35 class TestToolbarActionsBarHelperCocoa : public TestToolbarActionsBarHelper {
36  public:
37   TestToolbarActionsBarHelperCocoa(Browser* browser,
38                                    BrowserActionsController* mainController);
39   ~TestToolbarActionsBarHelperCocoa() override;
41   BrowserActionsController* controller() { return controller_.get(); }
43  private:
44   // The owned BrowserActionsContainerView and BrowserActionsController; the
45   // mac implementation of the ToolbarActionsBar delegate and view.
46   base::scoped_nsobject<BrowserActionsContainerView> containerView_;
47   base::scoped_nsobject<BrowserActionsController> controller_;
49   DISALLOW_COPY_AND_ASSIGN(TestToolbarActionsBarHelperCocoa);
52 TestToolbarActionsBarHelperCocoa::TestToolbarActionsBarHelperCocoa(
53     Browser* browser,
54     BrowserActionsController* mainController) {
55   // Make sure that Cocoa has been bootstrapped.
56   if (!base::mac::FrameworkBundle()) {
57     // Look in the framework bundle for resources.
58     base::FilePath path;
59     PathService::Get(base::DIR_EXE, &path);
60     path = path.Append(chrome::kFrameworkName);
61     base::mac::SetOverrideFrameworkBundlePath(path);
62   }
64   containerView_.reset([[BrowserActionsContainerView alloc]
65       initWithFrame:NSMakeRect(0, 0, 0, 15)]);
66   controller_.reset(
67       [[BrowserActionsController alloc] initWithBrowser:browser
68                                           containerView:containerView_.get()
69                                          mainController:mainController]);
72 TestToolbarActionsBarHelperCocoa::~TestToolbarActionsBarHelperCocoa() {
75 BrowserActionsController* GetController(Browser* browser,
76                                         TestToolbarActionsBarHelper* helper) {
77   if (helper) {
78     return static_cast<TestToolbarActionsBarHelperCocoa*>(helper)->controller();
79   }
81   BrowserWindowCocoa* window =
82       static_cast<BrowserWindowCocoa*>(browser->window());
83   return [[window->cocoa_controller() toolbarController]
84            browserActionsController];
87 BrowserActionButton* GetButton(
88     Browser* browser,
89     TestToolbarActionsBarHelper* helper,
90     int index) {
91   return [GetController(browser, helper) buttonWithIndex:index];
94 }  // namespace
96 BrowserActionTestUtil::BrowserActionTestUtil(Browser* browser)
97     : BrowserActionTestUtil(browser, true) {
100 BrowserActionTestUtil::BrowserActionTestUtil(Browser* browser,
101                                              bool is_real_window)
102     : browser_(browser) {
103   if (!is_real_window)
104     test_helper_.reset(new TestToolbarActionsBarHelperCocoa(browser, nullptr));
105   // We disable animations on extension popups so that tests aren't waiting for
106   // a popup to fade out.
107   [ExtensionPopupController setAnimationsEnabledForTesting:NO];
110 BrowserActionTestUtil::~BrowserActionTestUtil() {}
112 int BrowserActionTestUtil::NumberOfBrowserActions() {
113   return [GetController(browser_, test_helper_.get()) buttonCount];
116 int BrowserActionTestUtil::VisibleBrowserActions() {
117   return [GetController(browser_, test_helper_.get()) visibleButtonCount];
120 bool BrowserActionTestUtil::IsChevronShowing() {
121   BrowserActionsController* controller =
122       GetController(browser_, test_helper_.get());
123   // The magic "18" comes from kChevronWidth in browser_actions_controller.mm.
124   return ![controller chevronIsHidden] &&
125          NSWidth([[controller containerView] animationEndFrame]) >= 18;
128 void BrowserActionTestUtil::InspectPopup(int index) {
129   NOTREACHED();
132 bool BrowserActionTestUtil::HasIcon(int index) {
133   return [GetButton(browser_, test_helper_.get(), index) image] != nil;
136 gfx::Image BrowserActionTestUtil::GetIcon(int index) {
137   NSImage* ns_image = [GetButton(browser_, test_helper_.get(), index) image];
138   // gfx::Image takes ownership of the |ns_image| reference. We have to increase
139   // the ref count so |ns_image| stays around when the image object is
140   // destroyed.
141   base::mac::NSObjectRetain(ns_image);
142   return gfx::Image(ns_image);
145 void BrowserActionTestUtil::Press(int index) {
146   NSButton* button = GetButton(browser_, test_helper_.get(), index);
147   [button performClick:nil];
150 std::string BrowserActionTestUtil::GetExtensionId(int index) {
151   return
152       [GetButton(browser_, test_helper_.get(), index) viewController]->GetId();
155 std::string BrowserActionTestUtil::GetTooltip(int index) {
156   NSString* tooltip = [GetButton(browser_, test_helper_.get(), index) toolTip];
157   return base::SysNSStringToUTF8(tooltip);
160 gfx::NativeView BrowserActionTestUtil::GetPopupNativeView() {
161   ToolbarActionViewController* popup_owner =
162       GetToolbarActionsBar()->popup_owner();
163   return popup_owner ? popup_owner->GetPopupNativeView() : nil;
166 bool BrowserActionTestUtil::HasPopup() {
167   return GetPopupNativeView() != nil;
170 gfx::Size BrowserActionTestUtil::GetPopupSize() {
171   NSRect bounds = [[[ExtensionPopupController popup] view] bounds];
172   return gfx::Size(NSSizeToCGSize(bounds.size));
175 bool BrowserActionTestUtil::HidePopup() {
176   ExtensionPopupController* controller = [ExtensionPopupController popup];
177   [controller close];
178   return !HasPopup();
181 bool BrowserActionTestUtil::ActionButtonWantsToRun(size_t index) {
182   return [GetButton(browser_, test_helper_.get(), index) wantsToRunForTesting];
185 void BrowserActionTestUtil::SetWidth(int width) {
186   BrowserActionsContainerView* containerView =
187       [GetController(browser_, test_helper_.get()) containerView];
188   NSRect frame = [containerView frame];
189   frame.size.width = width;
190   [containerView setFrame:frame];
193 ToolbarActionsBar* BrowserActionTestUtil::GetToolbarActionsBar() {
194   return [GetController(browser_, test_helper_.get()) toolbarActionsBar];
197 scoped_ptr<BrowserActionTestUtil> BrowserActionTestUtil::CreateOverflowBar() {
198   CHECK(!GetToolbarActionsBar()->in_overflow_mode())
199       << "Only a main bar can create an overflow bar!";
200   return make_scoped_ptr(new BrowserActionTestUtil(browser_, this));
203 // static
204 gfx::Size BrowserActionTestUtil::GetMinPopupSize() {
205   return gfx::Size(NSSizeToCGSize([ExtensionPopupController minPopupSize]));
208 // static
209 gfx::Size BrowserActionTestUtil::GetMaxPopupSize() {
210   return gfx::Size(NSSizeToCGSize([ExtensionPopupController maxPopupSize]));
213 BrowserActionTestUtil::BrowserActionTestUtil(Browser* browser,
214                                              BrowserActionTestUtil* main_bar)
215     : browser_(browser),
216       test_helper_(new TestToolbarActionsBarHelperCocoa(
217           browser_, GetController(browser_, main_bar->test_helper_.get()))) {