OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "chrome/browser/ui/cocoa/extensions/extension_action_platform_delegate_c ocoa.h" | 5 #import "chrome/browser/ui/cocoa/extensions/extension_action_platform_delegate_c ocoa.h" |
6 | 6 |
7 #include <string> | |
8 #include <utility> | |
9 | |
10 #include "base/logging.h" | |
11 #include "chrome/browser/extensions/extension_action.h" | |
12 #include "chrome/browser/ui/browser.h" | |
13 #include "chrome/browser/ui/browser_window.h" | |
14 #import "chrome/browser/ui/cocoa/extensions/extension_action_context_menu_contro ller.h" | |
7 #import "chrome/browser/ui/cocoa/extensions/extension_popup_controller.h" | 15 #import "chrome/browser/ui/cocoa/extensions/extension_popup_controller.h" |
8 #import "chrome/browser/ui/cocoa/toolbar/toolbar_action_view_delegate_cocoa.h" | 16 #import "chrome/browser/ui/cocoa/toolbar/toolbar_action_view_delegate_cocoa.h" |
17 #include "chrome/common/extensions/api/extension_action/action_info.h" | |
18 #include "content/public/browser/notification_details.h" | |
19 #include "content/public/browser/notification_source.h" | |
20 #include "extensions/browser/notification_types.h" | |
9 #include "extensions/common/extension.h" | 21 #include "extensions/common/extension.h" |
10 | 22 |
23 namespace { | |
24 | |
25 // Returns the notification to listen to for activation for a particular | |
26 // |extension_action|. | |
27 int GetNotificationTypeForAction(const ExtensionAction& extension_action) { | |
28 if (extension_action.action_type() == extensions::ActionInfo::TYPE_BROWSER) | |
29 return extensions::NOTIFICATION_EXTENSION_COMMAND_BROWSER_ACTION_MAC; | |
30 | |
31 // We should only have page and browser action types. | |
32 DCHECK_EQ(extensions::ActionInfo::TYPE_PAGE, extension_action.action_type()); | |
33 return extensions::NOTIFICATION_EXTENSION_COMMAND_PAGE_ACTION_MAC; | |
34 } | |
35 | |
36 } // namespace | |
37 | |
11 // static | 38 // static |
12 scoped_ptr<ExtensionActionPlatformDelegate> | 39 scoped_ptr<ExtensionActionPlatformDelegate> |
13 ExtensionActionPlatformDelegate::Create( | 40 ExtensionActionPlatformDelegate::Create( |
14 ExtensionActionViewController* controller) { | 41 ExtensionActionViewController* controller) { |
15 return make_scoped_ptr(new ExtensionActionPlatformDelegateCocoa(controller)); | 42 return make_scoped_ptr(new ExtensionActionPlatformDelegateCocoa(controller)); |
16 } | 43 } |
17 | 44 |
18 ExtensionActionPlatformDelegateCocoa::ExtensionActionPlatformDelegateCocoa( | 45 ExtensionActionPlatformDelegateCocoa::ExtensionActionPlatformDelegateCocoa( |
19 ExtensionActionViewController* controller) | 46 ExtensionActionViewController* controller) |
20 : controller_(controller) { | 47 : controller_(controller) { |
(...skipping 10 matching lines...) Expand all Loading... | |
31 bool ExtensionActionPlatformDelegateCocoa::IsMenuRunning() const { | 58 bool ExtensionActionPlatformDelegateCocoa::IsMenuRunning() const { |
32 // TODO(devlin): Also account for context menus. | 59 // TODO(devlin): Also account for context menus. |
33 return GetPopup() != nil; | 60 return GetPopup() != nil; |
34 } | 61 } |
35 | 62 |
36 void ExtensionActionPlatformDelegateCocoa::RegisterCommand() { | 63 void ExtensionActionPlatformDelegateCocoa::RegisterCommand() { |
37 // Commands are handled elsewhere for cocoa. | 64 // Commands are handled elsewhere for cocoa. |
38 } | 65 } |
39 | 66 |
40 void ExtensionActionPlatformDelegateCocoa::OnDelegateSet() { | 67 void ExtensionActionPlatformDelegateCocoa::OnDelegateSet() { |
68 if (controller_->extension()->ShowConfigureContextMenus()) { | |
69 menuController_.reset([[ExtensionActionContextMenuController alloc] | |
70 initWithExtension:controller_->extension() | |
71 browser:controller_->browser() | |
72 extensionAction:controller_->extension_action()]); | |
73 GetDelegateCocoa()->SetContextMenuController(menuController_.get()); | |
74 } | |
75 | |
76 registrar_.Add( | |
77 this, | |
78 extensions::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE, | |
79 content::Source<Profile>(controller_->browser()->profile())); | |
80 registrar_.Add( | |
81 this, | |
82 GetNotificationTypeForAction(*controller_->extension_action()), | |
83 content::Source<Profile>(controller_->browser()->profile())); | |
41 } | 84 } |
42 | 85 |
43 bool ExtensionActionPlatformDelegateCocoa::IsShowingPopup() const { | 86 bool ExtensionActionPlatformDelegateCocoa::IsShowingPopup() const { |
44 return GetPopup() != nil; | 87 return GetPopup() != nil; |
45 } | 88 } |
46 | 89 |
47 void ExtensionActionPlatformDelegateCocoa::CloseActivePopup() { | 90 void ExtensionActionPlatformDelegateCocoa::CloseActivePopup() { |
48 ExtensionPopupController* popup = [ExtensionPopupController popup]; | 91 ExtensionPopupController* popup = [ExtensionPopupController popup]; |
49 if (popup) | 92 if (popup && ![popup isClosing]) |
50 [popup close]; | 93 [popup close]; |
51 } | 94 } |
52 | 95 |
53 void ExtensionActionPlatformDelegateCocoa::CloseOwnPopup() { | 96 void ExtensionActionPlatformDelegateCocoa::CloseOwnPopup() { |
54 ExtensionPopupController* popup = GetPopup(); | 97 ExtensionPopupController* popup = GetPopup(); |
55 DCHECK(popup); | 98 DCHECK(popup); |
56 [popup close]; | 99 if (popup && ![popup isClosing]) |
100 [popup close]; | |
57 } | 101 } |
58 | 102 |
59 bool ExtensionActionPlatformDelegateCocoa::ShowPopupWithUrl( | 103 bool ExtensionActionPlatformDelegateCocoa::ShowPopupWithUrl( |
60 ExtensionActionViewController::PopupShowAction show_action, | 104 ExtensionActionViewController::PopupShowAction show_action, |
61 const GURL& popup_url, | 105 const GURL& popup_url, |
62 bool grant_tab_permissions) { | 106 bool grant_tab_permissions) { |
63 NSPoint arrowPoint = GetDelegateCocoa()->GetPopupPoint(); | 107 NSPoint arrowPoint = GetDelegateCocoa()->GetPopupPoint(); |
64 [ExtensionPopupController showURL:popup_url | 108 [ExtensionPopupController showURL:popup_url |
65 inBrowser:controller_->browser() | 109 inBrowser:controller_->browser() |
66 anchoredAt:arrowPoint | 110 anchoredAt:arrowPoint |
67 arrowLocation:info_bubble::kTopRight | 111 arrowLocation:info_bubble::kTopRight |
68 devMode:NO]; | 112 devMode:NO]; |
69 return true; | 113 return true; |
70 } | 114 } |
71 | 115 |
72 ToolbarActionViewDelegateCocoa* | 116 ToolbarActionViewDelegateCocoa* |
73 ExtensionActionPlatformDelegateCocoa::GetDelegateCocoa() { | 117 ExtensionActionPlatformDelegateCocoa::GetDelegateCocoa() { |
74 return static_cast<ToolbarActionViewDelegateCocoa*>( | 118 return static_cast<ToolbarActionViewDelegateCocoa*>( |
75 controller_->view_delegate()); | 119 controller_->view_delegate()); |
76 } | 120 } |
77 | 121 |
78 ExtensionPopupController* ExtensionActionPlatformDelegateCocoa::GetPopup() | 122 ExtensionPopupController* ExtensionActionPlatformDelegateCocoa::GetPopup() |
79 const { | 123 const { |
80 ExtensionPopupController* popup = [ExtensionPopupController popup]; | 124 ExtensionPopupController* popup = [ExtensionPopupController popup]; |
81 return popup && [popup extensionId] == controller_->extension()->id() ? | 125 return popup && [popup extensionId] == controller_->extension()->id() ? |
82 popup : nil; | 126 popup : nil; |
83 } | 127 } |
128 | |
129 void ExtensionActionPlatformDelegateCocoa::Observe( | |
130 int type, | |
131 const content::NotificationSource& source, | |
132 const content::NotificationDetails& details) { | |
133 switch (type) { | |
134 case extensions::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE: | |
135 CloseActivePopup(); | |
136 break; | |
137 case extensions::NOTIFICATION_EXTENSION_COMMAND_BROWSER_ACTION_MAC: | |
138 case extensions::NOTIFICATION_EXTENSION_COMMAND_PAGE_ACTION_MAC: { | |
Avi (use Gerrit)
2014/11/03 22:04:00
Not for this CL, but why don't we collapse these?
Devlin
2014/11/03 22:07:28
I can't think of a reason to not (since extensions
| |
139 DCHECK_EQ(type, | |
140 GetNotificationTypeForAction(*controller_->extension_action())); | |
141 std::pair<const std::string, gfx::NativeWindow>* payload = | |
142 content::Details<std::pair<const std::string, gfx::NativeWindow> >( | |
143 details).ptr(); | |
144 const std::string& extension_id = payload->first; | |
145 gfx::NativeWindow window = payload->second; | |
146 if (window == controller_->browser()->window()->GetNativeWindow() && | |
147 extension_id == controller_->extension()->id() && | |
148 controller_->IsEnabled( | |
149 controller_->view_delegate()->GetCurrentWebContents())) { | |
150 controller_->ExecuteAction(true); | |
151 } | |
152 break; | |
153 } | |
154 default: | |
155 NOTREACHED() << L"Unexpected notification"; | |
156 } | |
157 } | |
OLD | NEW |