OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_installed_bubble_controlle
r.h" | 5 #import "chrome/browser/ui/cocoa/extensions/extension_installed_bubble_controlle
r.h" |
6 | 6 |
7 #include "base/i18n/rtl.h" | 7 #include "base/i18n/rtl.h" |
8 #include "base/mac/bundle_locations.h" | 8 #include "base/mac/bundle_locations.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/strings/sys_string_conversions.h" | 10 #include "base/strings/sys_string_conversions.h" |
(...skipping 12 matching lines...) Expand all Loading... |
23 #include "chrome/browser/ui/cocoa/browser_window_cocoa.h" | 23 #include "chrome/browser/ui/cocoa/browser_window_cocoa.h" |
24 #include "chrome/browser/ui/cocoa/browser_window_controller.h" | 24 #include "chrome/browser/ui/cocoa/browser_window_controller.h" |
25 #include "chrome/browser/ui/cocoa/extensions/browser_actions_controller.h" | 25 #include "chrome/browser/ui/cocoa/extensions/browser_actions_controller.h" |
26 #include "chrome/browser/ui/cocoa/hover_close_button.h" | 26 #include "chrome/browser/ui/cocoa/hover_close_button.h" |
27 #include "chrome/browser/ui/cocoa/info_bubble_view.h" | 27 #include "chrome/browser/ui/cocoa/info_bubble_view.h" |
28 #include "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" | 28 #include "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" |
29 #include "chrome/browser/ui/cocoa/new_tab_button.h" | 29 #include "chrome/browser/ui/cocoa/new_tab_button.h" |
30 #include "chrome/browser/ui/cocoa/tabs/tab_strip_view.h" | 30 #include "chrome/browser/ui/cocoa/tabs/tab_strip_view.h" |
31 #include "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h" | 31 #include "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h" |
32 #include "chrome/browser/ui/extensions/extension_install_ui_factory.h" | 32 #include "chrome/browser/ui/extensions/extension_install_ui_factory.h" |
| 33 #include "chrome/browser/ui/extensions/extension_installed_bubble.h" |
33 #include "chrome/browser/ui/singleton_tabs.h" | 34 #include "chrome/browser/ui/singleton_tabs.h" |
34 #include "chrome/browser/ui/sync/sync_promo_ui.h" | 35 #include "chrome/browser/ui/sync/sync_promo_ui.h" |
35 #include "chrome/common/extensions/api/commands/commands_handler.h" | 36 #include "chrome/common/extensions/api/commands/commands_handler.h" |
36 #include "chrome/common/extensions/api/extension_action/action_info.h" | 37 #include "chrome/common/extensions/api/extension_action/action_info.h" |
37 #include "chrome/common/extensions/api/omnibox/omnibox_handler.h" | 38 #include "chrome/common/extensions/api/omnibox/omnibox_handler.h" |
38 #include "chrome/common/extensions/sync_helper.h" | 39 #include "chrome/common/extensions/sync_helper.h" |
39 #include "chrome/common/url_constants.h" | 40 #include "chrome/common/url_constants.h" |
40 #include "chrome/grit/chromium_strings.h" | 41 #include "chrome/grit/chromium_strings.h" |
41 #include "chrome/grit/generated_resources.h" | 42 #include "chrome/grit/generated_resources.h" |
42 #include "content/public/browser/notification_details.h" | 43 #include "content/public/browser/notification_details.h" |
43 #include "content/public/browser/notification_registrar.h" | 44 #include "content/public/browser/notification_registrar.h" |
44 #include "content/public/browser/notification_source.h" | 45 #include "content/public/browser/notification_source.h" |
45 #include "extensions/browser/install/extension_install_ui.h" | 46 #include "extensions/browser/install/extension_install_ui.h" |
46 #include "extensions/common/extension.h" | 47 #include "extensions/common/extension.h" |
47 #include "extensions/common/feature_switch.h" | 48 #include "extensions/common/feature_switch.h" |
48 #import "skia/ext/skia_utils_mac.h" | 49 #import "skia/ext/skia_utils_mac.h" |
49 #import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTw
eaker.h" | 50 #import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTw
eaker.h" |
50 #import "ui/base/cocoa/controls/hyperlink_text_view.h" | 51 #import "ui/base/cocoa/controls/hyperlink_text_view.h" |
51 #include "ui/base/l10n/l10n_util.h" | 52 #include "ui/base/l10n/l10n_util.h" |
52 | 53 |
53 using content::BrowserThread; | 54 using content::BrowserThread; |
54 using extensions::BundleInstaller; | 55 using extensions::BundleInstaller; |
55 using extensions::Extension; | 56 using extensions::Extension; |
56 using extensions::UnloadedExtensionInfo; | 57 using extensions::UnloadedExtensionInfo; |
57 | 58 |
58 // C++ class that receives EXTENSION_LOADED notifications and proxies them back | 59 class ExtensionInstalledBubbleBridge |
59 // to |controller|. | 60 : public ExtensionInstalledBubble::Delegate { |
60 class ExtensionLoadedNotificationObserver | |
61 : public content::NotificationObserver { | |
62 public: | 61 public: |
63 ExtensionLoadedNotificationObserver( | 62 explicit ExtensionInstalledBubbleBridge( |
64 ExtensionInstalledBubbleController* controller, Profile* profile) | 63 ExtensionInstalledBubbleController* controller); |
65 : controller_(controller) { | 64 ~ExtensionInstalledBubbleBridge() override; |
66 registrar_.Add(this, | |
67 extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, | |
68 content::Source<Profile>(profile)); | |
69 registrar_.Add(this, | |
70 extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED, | |
71 content::Source<Profile>(profile)); | |
72 } | |
73 | 65 |
74 private: | 66 private: |
75 // NotificationObserver implementation. Tells the controller to start showing | 67 // ExtensionInstalledBubble::Delegate: |
76 // its window on the main thread when the extension has finished loading. | 68 bool MaybeShowNow() override; |
77 void Observe(int type, | |
78 const content::NotificationSource& source, | |
79 const content::NotificationDetails& details) override { | |
80 if (type == extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED) { | |
81 const Extension* extension = | |
82 content::Details<const Extension>(details).ptr(); | |
83 if (extension == [controller_ extension]) { | |
84 [controller_ performSelectorOnMainThread:@selector(showWindow:) | |
85 withObject:controller_ | |
86 waitUntilDone:NO]; | |
87 } | |
88 } else if (type == extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED) { | |
89 const Extension* extension = | |
90 content::Details<const UnloadedExtensionInfo>(details)->extension; | |
91 if (extension == [controller_ extension]) { | |
92 [controller_ performSelectorOnMainThread:@selector(extensionUnloaded:) | |
93 withObject:controller_ | |
94 waitUntilDone:NO]; | |
95 } | |
96 } else { | |
97 NOTREACHED() << "Received unexpected notification."; | |
98 } | |
99 } | |
100 | 69 |
101 content::NotificationRegistrar registrar_; | 70 // The (owning) installed bubble controller. |
102 ExtensionInstalledBubbleController* controller_; // weak, owns us | 71 ExtensionInstalledBubbleController* controller_; |
| 72 |
| 73 DISALLOW_COPY_AND_ASSIGN(ExtensionInstalledBubbleBridge); |
103 }; | 74 }; |
104 | 75 |
| 76 ExtensionInstalledBubbleBridge::ExtensionInstalledBubbleBridge( |
| 77 ExtensionInstalledBubbleController* controller) |
| 78 : controller_(controller) { |
| 79 } |
| 80 |
| 81 ExtensionInstalledBubbleBridge::~ExtensionInstalledBubbleBridge() { |
| 82 } |
| 83 |
| 84 bool ExtensionInstalledBubbleBridge::MaybeShowNow() { |
| 85 [controller_ showWindow:controller_]; |
| 86 return true; |
| 87 } |
| 88 |
105 @implementation ExtensionInstalledBubbleController | 89 @implementation ExtensionInstalledBubbleController |
106 | 90 |
107 @synthesize extension = extension_; | |
108 @synthesize bundle = bundle_; | 91 @synthesize bundle = bundle_; |
109 // Exposed for unit test. | 92 // Exposed for unit test. |
110 @synthesize pageActionPreviewShowing = pageActionPreviewShowing_; | 93 @synthesize pageActionPreviewShowing = pageActionPreviewShowing_; |
111 | 94 |
112 - (id)initWithParentWindow:(NSWindow*)parentWindow | 95 - (id)initWithParentWindow:(NSWindow*)parentWindow |
113 extension:(const Extension*)extension | 96 extension:(const Extension*)extension |
114 bundle:(const BundleInstaller*)bundle | 97 bundle:(const BundleInstaller*)bundle |
115 browser:(Browser*)browser | 98 browser:(Browser*)browser |
116 icon:(SkBitmap)icon { | 99 icon:(SkBitmap)icon { |
117 NSString* nibName = bundle ? @"ExtensionInstalledBubbleBundle" : | 100 NSString* nibName = bundle ? @"ExtensionInstalledBubbleBundle" : |
118 @"ExtensionInstalledBubble"; | 101 @"ExtensionInstalledBubble"; |
119 if ((self = [super initWithWindowNibPath:nibName | 102 if ((self = [super initWithWindowNibPath:nibName |
120 parentWindow:parentWindow | 103 parentWindow:parentWindow |
121 anchoredAt:NSZeroPoint])) { | 104 anchoredAt:NSZeroPoint])) { |
122 extension_ = extension; | |
123 bundle_ = bundle; | 105 bundle_ = bundle; |
124 DCHECK(browser); | 106 DCHECK(browser); |
125 browser_ = browser; | 107 browser_ = browser; |
126 icon_.reset([gfx::SkBitmapToNSImage(icon) retain]); | 108 icon_.reset([gfx::SkBitmapToNSImage(icon) retain]); |
127 pageActionPreviewShowing_ = NO; | 109 pageActionPreviewShowing_ = NO; |
128 | 110 |
129 if (bundle_) { | 111 if (bundle_) { |
130 type_ = extension_installed_bubble::kBundle; | 112 type_ = extension_installed_bubble::kBundle; |
131 } else if (extension->is_app()) { | 113 } else if (extension->is_app()) { |
132 type_ = extension_installed_bubble::kApp; | 114 type_ = extension_installed_bubble::kApp; |
133 } else if (!extensions::OmniboxInfo::GetKeyword(extension).empty()) { | 115 } else if (!extensions::OmniboxInfo::GetKeyword(extension).empty()) { |
134 type_ = extension_installed_bubble::kOmniboxKeyword; | 116 type_ = extension_installed_bubble::kOmniboxKeyword; |
135 } else if (extensions::ActionInfo::GetBrowserActionInfo(extension)) { | 117 } else if (extensions::ActionInfo::GetBrowserActionInfo(extension)) { |
136 type_ = extension_installed_bubble::kBrowserAction; | 118 type_ = extension_installed_bubble::kBrowserAction; |
137 } else if (extensions::ActionInfo::GetPageActionInfo(extension) && | 119 } else if (extensions::ActionInfo::GetPageActionInfo(extension) && |
138 extensions::ActionInfo::IsVerboseInstallMessage(extension)) { | 120 extensions::ActionInfo::IsVerboseInstallMessage(extension)) { |
139 type_ = extension_installed_bubble::kPageAction; | 121 type_ = extension_installed_bubble::kPageAction; |
140 } else { | 122 } else { |
141 type_ = extension_installed_bubble::kGeneric; | 123 type_ = extension_installed_bubble::kGeneric; |
142 } | 124 } |
143 | 125 |
144 if (type_ == extension_installed_bubble::kBundle) { | 126 if (type_ == extension_installed_bubble::kBundle) { |
145 [self showWindow:self]; | 127 [self showWindow:self]; |
146 } else { | 128 } else { |
147 // Start showing window only after extension has fully loaded. | 129 // Start showing window only after extension has fully loaded. |
148 extensionObserver_.reset(new ExtensionLoadedNotificationObserver( | 130 installedBubbleBridge_.reset(new ExtensionInstalledBubbleBridge(self)); |
149 self, browser->profile())); | 131 installedBubble_.reset(new ExtensionInstalledBubble( |
| 132 installedBubbleBridge_.get(), |
| 133 extension, |
| 134 browser, |
| 135 icon)); |
| 136 installedBubble_->IgnoreBrowserClosing(); |
150 } | 137 } |
151 } | 138 } |
152 return self; | 139 return self; |
153 } | 140 } |
154 | 141 |
| 142 - (const Extension*)extension { |
| 143 return installedBubble_->extension(); |
| 144 } |
| 145 |
155 // Sets |promo_| based on |promoPlaceholder_|, sets |promoPlaceholder_| to nil. | 146 // Sets |promo_| based on |promoPlaceholder_|, sets |promoPlaceholder_| to nil. |
156 - (void)initializeLabel { | 147 - (void)initializeLabel { |
157 // Replace the promo placeholder NSTextField with the real label NSTextView. | 148 // Replace the promo placeholder NSTextField with the real label NSTextView. |
158 // The former doesn't show links in a nice way, but the latter can't be added | 149 // The former doesn't show links in a nice way, but the latter can't be added |
159 // in IB without a containing scroll view, so create the NSTextView | 150 // in IB without a containing scroll view, so create the NSTextView |
160 // programmatically. | 151 // programmatically. |
161 promo_.reset([[HyperlinkTextView alloc] | 152 promo_.reset([[HyperlinkTextView alloc] |
162 initWithFrame:[promoPlaceholder_ frame]]); | 153 initWithFrame:[promoPlaceholder_ frame]]); |
163 [promo_.get() setAutoresizingMask:[promoPlaceholder_ autoresizingMask]]; | 154 [promo_.get() setAutoresizingMask:[promoPlaceholder_ autoresizingMask]]; |
164 [[promoPlaceholder_ superview] | 155 [[promoPlaceholder_ superview] |
165 replaceSubview:promoPlaceholder_ with:promo_.get()]; | 156 replaceSubview:promoPlaceholder_ with:promo_.get()]; |
166 promoPlaceholder_ = nil; // Now released. | 157 promoPlaceholder_ = nil; // Now released. |
167 [promo_.get() setDelegate:self]; | 158 [promo_.get() setDelegate:self]; |
168 } | 159 } |
169 | 160 |
170 // Returns YES if the sync promo should be shown in the bubble. | 161 // Returns YES if the sync promo should be shown in the bubble. |
171 - (BOOL)showSyncPromo { | 162 - (BOOL)showSyncPromo { |
172 return extensions::sync_helper::IsSyncableExtension(extension_) && | 163 return extensions::sync_helper::IsSyncableExtension([self extension]) && |
173 SyncPromoUI::ShouldShowSyncPromo(browser_->profile()); | 164 SyncPromoUI::ShouldShowSyncPromo(browser_->profile()); |
174 } | 165 } |
175 | 166 |
176 - (void)windowWillClose:(NSNotification*)notification { | 167 - (void)windowWillClose:(NSNotification*)notification { |
177 // Turn off page action icon preview when the window closes, unless we | 168 // Turn off page action icon preview when the window closes, unless we |
178 // already removed it when the window resigned key status. | 169 // already removed it when the window resigned key status. |
179 [self removePageActionPreviewIfNecessary]; | 170 [self removePageActionPreviewIfNecessary]; |
180 extension_ = NULL; | |
181 browser_ = NULL; | 171 browser_ = NULL; |
182 [closeButton_ setTrackingEnabled:NO]; | 172 [closeButton_ setTrackingEnabled:NO]; |
183 [super windowWillClose:notification]; | 173 [super windowWillClose:notification]; |
184 } | 174 } |
185 | 175 |
186 // The controller is the delegate of the window, so it receives "did resign | 176 // The controller is the delegate of the window, so it receives "did resign |
187 // key" notifications. When key is resigned, close the window. | 177 // key" notifications. When key is resigned, close the window. |
188 - (void)windowDidResignKey:(NSNotification*)notification { | 178 - (void)windowDidResignKey:(NSNotification*)notification { |
189 // If the browser window is closing, we need to remove the page action | 179 // If the browser window is closing, we need to remove the page action |
190 // immediately, otherwise the closing animation may overlap with | 180 // immediately, otherwise the closing animation may overlap with |
(...skipping 11 matching lines...) Expand all Loading... |
202 clickedOnLink:(id)link | 192 clickedOnLink:(id)link |
203 atIndex:(NSUInteger)charIndex { | 193 atIndex:(NSUInteger)charIndex { |
204 DCHECK_EQ(promo_.get(), aTextView); | 194 DCHECK_EQ(promo_.get(), aTextView); |
205 chrome::ShowBrowserSignin(browser_, | 195 chrome::ShowBrowserSignin(browser_, |
206 signin_metrics::SOURCE_EXTENSION_INSTALL_BUBBLE); | 196 signin_metrics::SOURCE_EXTENSION_INSTALL_BUBBLE); |
207 return YES; | 197 return YES; |
208 } | 198 } |
209 | 199 |
210 // Extracted to a function here so that it can be overridden for unit testing. | 200 // Extracted to a function here so that it can be overridden for unit testing. |
211 - (void)removePageActionPreviewIfNecessary { | 201 - (void)removePageActionPreviewIfNecessary { |
212 if (!extension_ || !pageActionPreviewShowing_) | 202 if (![self extension] || !pageActionPreviewShowing_) |
213 return; | 203 return; |
214 ExtensionAction* page_action = | 204 ExtensionAction* page_action = |
215 extensions::ExtensionActionManager::Get(browser_->profile())-> | 205 extensions::ExtensionActionManager::Get(browser_->profile())-> |
216 GetPageAction(*extension_); | 206 GetPageAction(*[self extension]); |
217 if (!page_action) | 207 if (!page_action) |
218 return; | 208 return; |
219 pageActionPreviewShowing_ = NO; | 209 pageActionPreviewShowing_ = NO; |
220 | 210 |
221 BrowserWindowCocoa* window = | 211 BrowserWindowCocoa* window = |
222 static_cast<BrowserWindowCocoa*>(browser_->window()); | 212 static_cast<BrowserWindowCocoa*>(browser_->window()); |
223 LocationBarViewMac* locationBarView = | 213 LocationBarViewMac* locationBarView = |
224 [window->cocoa_controller() locationBarBridge]; | 214 [window->cocoa_controller() locationBarBridge]; |
225 locationBarView->SetPreviewEnabledPageAction(page_action, | 215 locationBarView->SetPreviewEnabledPageAction(page_action, |
226 false); // disables preview. | 216 false); // disables preview. |
(...skipping 19 matching lines...) Expand all Loading... |
246 NSMaxY(bounds) - extension_installed_bubble::kAppsBubbleArrowOffset); | 236 NSMaxY(bounds) - extension_installed_bubble::kAppsBubbleArrowOffset); |
247 arrowPoint = [button convertPoint:anchor toView:nil]; | 237 arrowPoint = [button convertPoint:anchor toView:nil]; |
248 } else if (type_ == extension_installed_bubble::kBrowserAction || | 238 } else if (type_ == extension_installed_bubble::kBrowserAction || |
249 extensions::FeatureSwitch::extension_action_redesign()-> | 239 extensions::FeatureSwitch::extension_action_redesign()-> |
250 IsEnabled()) { | 240 IsEnabled()) { |
251 // If the toolbar redesign is enabled, all bubbles for extensions point to | 241 // If the toolbar redesign is enabled, all bubbles for extensions point to |
252 // their toolbar action. | 242 // their toolbar action. |
253 BrowserActionsController* controller = | 243 BrowserActionsController* controller = |
254 [[window->cocoa_controller() toolbarController] | 244 [[window->cocoa_controller() toolbarController] |
255 browserActionsController]; | 245 browserActionsController]; |
256 arrowPoint = [controller popupPointForId:extension_->id()]; | 246 arrowPoint = [controller popupPointForId:[self extension]->id()]; |
257 } else if (type_ == extension_installed_bubble::kPageAction) { | 247 } else if (type_ == extension_installed_bubble::kPageAction) { |
258 LocationBarViewMac* locationBarView = | 248 LocationBarViewMac* locationBarView = |
259 [window->cocoa_controller() locationBarBridge]; | 249 [window->cocoa_controller() locationBarBridge]; |
260 | 250 |
261 ExtensionAction* page_action = | 251 ExtensionAction* page_action = |
262 extensions::ExtensionActionManager::Get(browser_->profile())-> | 252 extensions::ExtensionActionManager::Get(browser_->profile())-> |
263 GetPageAction(*extension_); | 253 GetPageAction(*[self extension]); |
264 | 254 |
265 // Tell the location bar to show a preview of the page action icon, | 255 // Tell the location bar to show a preview of the page action icon, |
266 // which would ordinarily only be displayed on a page of the appropriate | 256 // which would ordinarily only be displayed on a page of the appropriate |
267 // type. We remove this preview when the extension installed bubble | 257 // type. We remove this preview when the extension installed bubble |
268 // closes. | 258 // closes. |
269 locationBarView->SetPreviewEnabledPageAction(page_action, true); | 259 locationBarView->SetPreviewEnabledPageAction(page_action, true); |
270 pageActionPreviewShowing_ = YES; | 260 pageActionPreviewShowing_ = YES; |
271 | 261 |
272 // Find the center of the bottom of the page action icon. | 262 // Find the center of the bottom of the page action icon. |
273 arrowPoint = locationBarView->GetPageActionBubblePoint(page_action); | 263 arrowPoint = locationBarView->GetPageActionBubblePoint(page_action); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 } | 325 } |
336 [iconImage_ setImage:icon_]; | 326 [iconImage_ setImage:icon_]; |
337 [iconImage_ setNeedsDisplay:YES]; | 327 [iconImage_ setNeedsDisplay:YES]; |
338 return window; | 328 return window; |
339 } | 329 } |
340 | 330 |
341 - (bool)hasActivePageAction:(extensions::Command*)command { | 331 - (bool)hasActivePageAction:(extensions::Command*)command { |
342 extensions::CommandService* command_service = | 332 extensions::CommandService* command_service = |
343 extensions::CommandService::Get(browser_->profile()); | 333 extensions::CommandService::Get(browser_->profile()); |
344 if (type_ == extension_installed_bubble::kPageAction) { | 334 if (type_ == extension_installed_bubble::kPageAction) { |
345 if (extensions::CommandsInfo::GetPageActionCommand(extension_) && | 335 if (extensions::CommandsInfo::GetPageActionCommand([self extension]) && |
346 command_service->GetPageActionCommand( | 336 command_service->GetPageActionCommand( |
347 extension_->id(), | 337 [self extension]->id(), |
348 extensions::CommandService::ACTIVE, | 338 extensions::CommandService::ACTIVE, |
349 command, | 339 command, |
350 NULL)) { | 340 NULL)) { |
351 return true; | 341 return true; |
352 } | 342 } |
353 } | 343 } |
354 | 344 |
355 return false; | 345 return false; |
356 } | 346 } |
357 | 347 |
358 - (bool)hasActiveBrowserAction:(extensions::Command*)command { | 348 - (bool)hasActiveBrowserAction:(extensions::Command*)command { |
359 extensions::CommandService* command_service = | 349 extensions::CommandService* command_service = |
360 extensions::CommandService::Get(browser_->profile()); | 350 extensions::CommandService::Get(browser_->profile()); |
361 if (type_ == extension_installed_bubble::kBrowserAction) { | 351 if (type_ == extension_installed_bubble::kBrowserAction) { |
362 if (extensions::CommandsInfo::GetBrowserActionCommand(extension_) && | 352 if (extensions::CommandsInfo::GetBrowserActionCommand([self extension]) && |
363 command_service->GetBrowserActionCommand( | 353 command_service->GetBrowserActionCommand( |
364 extension_->id(), | 354 [self extension]->id(), |
365 extensions::CommandService::ACTIVE, | 355 extensions::CommandService::ACTIVE, |
366 command, | 356 command, |
367 NULL)) { | 357 NULL)) { |
368 return true; | 358 return true; |
369 } | 359 } |
370 } | 360 } |
371 | 361 |
372 return false; | 362 return false; |
373 } | 363 } |
374 | 364 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
449 // it with text (it tells you it is single-line even if it is multiline), so | 439 // it with text (it tells you it is single-line even if it is multiline), so |
450 // here the hidden howToUse_ TextField is temporarily repurposed to | 440 // here the hidden howToUse_ TextField is temporarily repurposed to |
451 // calculate the correct height for the TextView. | 441 // calculate the correct height for the TextView. |
452 [[howToUse_ cell] setAttributedStringValue:[promo_ attributedString]]; | 442 [[howToUse_ cell] setAttributedStringValue:[promo_ attributedString]]; |
453 [GTMUILocalizerAndLayoutTweaker | 443 [GTMUILocalizerAndLayoutTweaker |
454 sizeToFitFixedWidthTextField:howToUse_]; | 444 sizeToFitFixedWidthTextField:howToUse_]; |
455 sync_promo_height = NSHeight([howToUse_ frame]); | 445 sync_promo_height = NSHeight([howToUse_ frame]); |
456 } | 446 } |
457 | 447 |
458 // First part of extension installed message, the heading. | 448 // First part of extension installed message, the heading. |
459 base::string16 extension_name = base::UTF8ToUTF16(extension_->name().c_str()); | 449 base::string16 extension_name = |
| 450 base::UTF8ToUTF16([self extension]->name().c_str()); |
460 base::i18n::AdjustStringForLocaleDirection(&extension_name); | 451 base::i18n::AdjustStringForLocaleDirection(&extension_name); |
461 [heading_ setStringValue:l10n_util::GetNSStringF( | 452 [heading_ setStringValue:l10n_util::GetNSStringF( |
462 IDS_EXTENSION_INSTALLED_HEADING, extension_name)]; | 453 IDS_EXTENSION_INSTALLED_HEADING, extension_name)]; |
463 [GTMUILocalizerAndLayoutTweaker | 454 [GTMUILocalizerAndLayoutTweaker |
464 sizeToFitFixedWidthTextField:heading_]; | 455 sizeToFitFixedWidthTextField:heading_]; |
465 newWindowHeight += NSHeight([heading_ frame]) + | 456 newWindowHeight += NSHeight([heading_ frame]) + |
466 extension_installed_bubble::kInnerVerticalMargin; | 457 extension_installed_bubble::kInnerVerticalMargin; |
467 | 458 |
468 // If type is browser/page action, include a special message about them. | 459 // If type is browser/page action, include a special message about them. |
469 if (type_ == extension_installed_bubble::kBrowserAction || | 460 if (type_ == extension_installed_bubble::kBrowserAction || |
470 type_ == extension_installed_bubble::kPageAction) { | 461 type_ == extension_installed_bubble::kPageAction) { |
471 [howToUse_ setStringValue:[self | 462 [howToUse_ setStringValue:[self |
472 installMessageForCurrentExtensionAction]]; | 463 installMessageForCurrentExtensionAction]]; |
473 [howToUse_ setHidden:NO]; | 464 [howToUse_ setHidden:NO]; |
474 [[howToUse_ cell] | 465 [[howToUse_ cell] |
475 setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; | 466 setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; |
476 [GTMUILocalizerAndLayoutTweaker | 467 [GTMUILocalizerAndLayoutTweaker |
477 sizeToFitFixedWidthTextField:howToUse_]; | 468 sizeToFitFixedWidthTextField:howToUse_]; |
478 newWindowHeight += NSHeight([howToUse_ frame]) + | 469 newWindowHeight += NSHeight([howToUse_ frame]) + |
479 extension_installed_bubble::kInnerVerticalMargin; | 470 extension_installed_bubble::kInnerVerticalMargin; |
480 } | 471 } |
481 | 472 |
482 // If type is omnibox keyword, include a special message about the keyword. | 473 // If type is omnibox keyword, include a special message about the keyword. |
483 if (type_ == extension_installed_bubble::kOmniboxKeyword) { | 474 if (type_ == extension_installed_bubble::kOmniboxKeyword) { |
484 [howToUse_ setStringValue:l10n_util::GetNSStringF( | 475 [howToUse_ setStringValue:l10n_util::GetNSStringF( |
485 IDS_EXTENSION_INSTALLED_OMNIBOX_KEYWORD_INFO, | 476 IDS_EXTENSION_INSTALLED_OMNIBOX_KEYWORD_INFO, |
486 base::UTF8ToUTF16(extensions::OmniboxInfo::GetKeyword(extension_)))]; | 477 base::UTF8ToUTF16(extensions::OmniboxInfo::GetKeyword( |
| 478 [self extension])))]; |
487 [howToUse_ setHidden:NO]; | 479 [howToUse_ setHidden:NO]; |
488 [[howToUse_ cell] | 480 [[howToUse_ cell] |
489 setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; | 481 setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; |
490 [GTMUILocalizerAndLayoutTweaker | 482 [GTMUILocalizerAndLayoutTweaker |
491 sizeToFitFixedWidthTextField:howToUse_]; | 483 sizeToFitFixedWidthTextField:howToUse_]; |
492 newWindowHeight += NSHeight([howToUse_ frame]) + | 484 newWindowHeight += NSHeight([howToUse_ frame]) + |
493 extension_installed_bubble::kInnerVerticalMargin; | 485 extension_installed_bubble::kInnerVerticalMargin; |
494 } | 486 } |
495 | 487 |
496 // If type is app, hide howToManage_, and include a "show me" link in the | 488 // If type is app, hide howToManage_, and include a "show me" link in the |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 return; | 591 return; |
600 } | 592 } |
601 | 593 |
602 NSRect headingFrame = [heading_ frame]; | 594 NSRect headingFrame = [heading_ frame]; |
603 headingFrame.origin.y = newWindowHeight - ( | 595 headingFrame.origin.y = newWindowHeight - ( |
604 NSHeight(headingFrame) + | 596 NSHeight(headingFrame) + |
605 extension_installed_bubble::kOuterVerticalMargin); | 597 extension_installed_bubble::kOuterVerticalMargin); |
606 [heading_ setFrame:headingFrame]; | 598 [heading_ setFrame:headingFrame]; |
607 | 599 |
608 NSRect howToManageFrame = [howToManage_ frame]; | 600 NSRect howToManageFrame = [howToManage_ frame]; |
609 if (!extensions::OmniboxInfo::GetKeyword(extension_).empty() || | 601 if (!extensions::OmniboxInfo::GetKeyword([self extension]).empty() || |
610 extensions::ActionInfo::GetBrowserActionInfo(extension_) || | 602 extensions::ActionInfo::GetBrowserActionInfo([self extension]) || |
611 extensions::ActionInfo::IsVerboseInstallMessage(extension_)) { | 603 extensions::ActionInfo::IsVerboseInstallMessage([self extension])) { |
612 // For browser actions, page actions and omnibox keyword show the | 604 // For browser actions, page actions and omnibox keyword show the |
613 // 'how to use' message before the 'how to manage' message. | 605 // 'how to use' message before the 'how to manage' message. |
614 NSRect howToUseFrame = [howToUse_ frame]; | 606 NSRect howToUseFrame = [howToUse_ frame]; |
615 howToUseFrame.origin.y = headingFrame.origin.y - ( | 607 howToUseFrame.origin.y = headingFrame.origin.y - ( |
616 NSHeight(howToUseFrame) + | 608 NSHeight(howToUseFrame) + |
617 extension_installed_bubble::kInnerVerticalMargin); | 609 extension_installed_bubble::kInnerVerticalMargin); |
618 [howToUse_ setFrame:howToUseFrame]; | 610 [howToUse_ setFrame:howToUseFrame]; |
619 | 611 |
620 howToManageFrame.origin.y = howToUseFrame.origin.y - ( | 612 howToManageFrame.origin.y = howToUseFrame.origin.y - ( |
621 NSHeight(howToManageFrame) + | 613 NSHeight(howToManageFrame) + |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
662 } | 654 } |
663 | 655 |
664 - (NSRect)frameOfSigninPromo { | 656 - (NSRect)frameOfSigninPromo { |
665 return [promo_ frame]; | 657 return [promo_ frame]; |
666 } | 658 } |
667 | 659 |
668 - (NSButton*)appInstalledShortcutLink { | 660 - (NSButton*)appInstalledShortcutLink { |
669 return appShortcutLink_; | 661 return appShortcutLink_; |
670 } | 662 } |
671 | 663 |
672 - (void)extensionUnloaded:(id)sender { | |
673 extension_ = NULL; | |
674 } | |
675 | |
676 - (IBAction)onManageShortcutClicked:(id)sender { | 664 - (IBAction)onManageShortcutClicked:(id)sender { |
677 [self close]; | 665 [self close]; |
678 std::string configure_url = chrome::kChromeUIExtensionsURL; | 666 std::string configure_url = chrome::kChromeUIExtensionsURL; |
679 configure_url += chrome::kExtensionConfigureCommandsSubPage; | 667 configure_url += chrome::kExtensionConfigureCommandsSubPage; |
680 chrome::NavigateParams params(chrome::GetSingletonTabNavigateParams( | 668 chrome::NavigateParams params(chrome::GetSingletonTabNavigateParams( |
681 browser_, GURL(configure_url))); | 669 browser_, GURL(configure_url))); |
682 chrome::Navigate(¶ms); | 670 chrome::Navigate(¶ms); |
683 } | 671 } |
684 | 672 |
685 - (IBAction)onAppShortcutClicked:(id)sender { | 673 - (IBAction)onAppShortcutClicked:(id)sender { |
686 scoped_ptr<extensions::ExtensionInstallUI> install_ui( | 674 scoped_ptr<extensions::ExtensionInstallUI> install_ui( |
687 extensions::CreateExtensionInstallUI(browser_->profile())); | 675 extensions::CreateExtensionInstallUI(browser_->profile())); |
688 install_ui->OpenAppInstalledUI(extension_->id()); | 676 install_ui->OpenAppInstalledUI([self extension]->id()); |
689 } | 677 } |
690 | 678 |
691 - (void)awakeFromNib { | 679 - (void)awakeFromNib { |
692 if (bundle_) | 680 if (bundle_) |
693 return; | 681 return; |
694 [self initializeLabel]; | 682 [self initializeLabel]; |
695 } | 683 } |
696 | 684 |
697 @end | 685 @end |
OLD | NEW |