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" | |
9 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
10 #include "base/strings/sys_string_conversions.h" | 9 #include "base/strings/sys_string_conversions.h" |
11 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
12 #include "chrome/browser/chrome_notification_types.h" | |
13 #include "chrome/browser/extensions/api/commands/command_service.h" | |
14 #include "chrome/browser/extensions/bundle_installer.h" | 11 #include "chrome/browser/extensions/bundle_installer.h" |
15 #include "chrome/browser/extensions/extension_action.h" | 12 #include "chrome/browser/extensions/extension_action.h" |
16 #include "chrome/browser/extensions/extension_action_manager.h" | 13 #include "chrome/browser/extensions/extension_action_manager.h" |
17 #include "chrome/browser/signin/signin_promo.h" | |
18 #include "chrome/browser/ui/browser.h" | 14 #include "chrome/browser/ui/browser.h" |
19 #include "chrome/browser/ui/browser_navigator.h" | 15 #include "chrome/browser/ui/browser_navigator.h" |
20 #include "chrome/browser/ui/browser_window.h" | 16 #include "chrome/browser/ui/browser_window.h" |
21 #include "chrome/browser/ui/chrome_pages.h" | 17 #include "chrome/browser/ui/chrome_pages.h" |
22 #include "chrome/browser/ui/chrome_style.h" | 18 #include "chrome/browser/ui/chrome_style.h" |
23 #include "chrome/browser/ui/cocoa/browser_window_cocoa.h" | 19 #include "chrome/browser/ui/cocoa/browser_window_cocoa.h" |
24 #include "chrome/browser/ui/cocoa/browser_window_controller.h" | 20 #include "chrome/browser/ui/cocoa/browser_window_controller.h" |
25 #include "chrome/browser/ui/cocoa/extensions/browser_actions_controller.h" | 21 #include "chrome/browser/ui/cocoa/extensions/browser_actions_controller.h" |
26 #include "chrome/browser/ui/cocoa/hover_close_button.h" | 22 #include "chrome/browser/ui/cocoa/hover_close_button.h" |
27 #include "chrome/browser/ui/cocoa/info_bubble_view.h" | 23 #include "chrome/browser/ui/cocoa/info_bubble_view.h" |
28 #include "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" | 24 #include "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" |
29 #include "chrome/browser/ui/cocoa/new_tab_button.h" | 25 #include "chrome/browser/ui/cocoa/new_tab_button.h" |
30 #include "chrome/browser/ui/cocoa/tabs/tab_strip_view.h" | 26 #include "chrome/browser/ui/cocoa/tabs/tab_strip_view.h" |
31 #include "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h" | 27 #include "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h" |
32 #include "chrome/browser/ui/extensions/extension_install_ui_factory.h" | 28 #include "chrome/browser/ui/extensions/extension_install_ui_factory.h" |
33 #include "chrome/browser/ui/extensions/extension_installed_bubble.h" | 29 #include "chrome/browser/ui/extensions/extension_installed_bubble.h" |
34 #include "chrome/browser/ui/singleton_tabs.h" | 30 #include "chrome/browser/ui/singleton_tabs.h" |
35 #include "chrome/browser/ui/sync/sync_promo_ui.h" | 31 #include "chrome/browser/ui/sync/sync_promo_ui.h" |
36 #include "chrome/common/extensions/api/commands/commands_handler.h" | |
37 #include "chrome/common/extensions/api/extension_action/action_info.h" | 32 #include "chrome/common/extensions/api/extension_action/action_info.h" |
38 #include "chrome/common/extensions/api/omnibox/omnibox_handler.h" | 33 #include "chrome/common/extensions/api/omnibox/omnibox_handler.h" |
39 #include "chrome/common/extensions/sync_helper.h" | 34 #include "chrome/common/extensions/sync_helper.h" |
40 #include "chrome/common/url_constants.h" | 35 #include "chrome/common/url_constants.h" |
41 #include "chrome/grit/chromium_strings.h" | 36 #include "chrome/grit/chromium_strings.h" |
42 #include "chrome/grit/generated_resources.h" | 37 #include "chrome/grit/generated_resources.h" |
43 #include "content/public/browser/notification_details.h" | 38 #include "components/signin/core/browser/signin_metrics.h" |
44 #include "content/public/browser/notification_registrar.h" | |
45 #include "content/public/browser/notification_source.h" | |
46 #include "extensions/browser/install/extension_install_ui.h" | 39 #include "extensions/browser/install/extension_install_ui.h" |
47 #include "extensions/common/extension.h" | 40 #include "extensions/common/extension.h" |
48 #include "extensions/common/feature_switch.h" | 41 #include "extensions/common/feature_switch.h" |
49 #import "skia/ext/skia_utils_mac.h" | 42 #import "skia/ext/skia_utils_mac.h" |
50 #import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTw
eaker.h" | 43 #import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTw
eaker.h" |
51 #import "ui/base/cocoa/controls/hyperlink_text_view.h" | 44 #import "ui/base/cocoa/controls/hyperlink_text_view.h" |
52 #include "ui/base/l10n/l10n_util.h" | 45 #include "ui/base/l10n/l10n_util.h" |
53 | 46 |
54 using content::BrowserThread; | 47 using content::BrowserThread; |
55 using extensions::BundleInstaller; | 48 using extensions::BundleInstaller; |
56 using extensions::Extension; | 49 using extensions::Extension; |
57 using extensions::UnloadedExtensionInfo; | |
58 | 50 |
59 class ExtensionInstalledBubbleBridge | 51 class ExtensionInstalledBubbleBridge |
60 : public ExtensionInstalledBubble::Delegate { | 52 : public ExtensionInstalledBubble::Delegate { |
61 public: | 53 public: |
62 explicit ExtensionInstalledBubbleBridge( | 54 explicit ExtensionInstalledBubbleBridge( |
63 ExtensionInstalledBubbleController* controller); | 55 ExtensionInstalledBubbleController* controller); |
64 ~ExtensionInstalledBubbleBridge() override; | 56 ~ExtensionInstalledBubbleBridge() override; |
65 | 57 |
66 private: | 58 private: |
67 // ExtensionInstalledBubble::Delegate: | 59 // ExtensionInstalledBubble::Delegate: |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 // Set appropriate icon, resizing if necessary. | 313 // Set appropriate icon, resizing if necessary. |
322 if ([icon_ size].width > extension_installed_bubble::kIconSize) { | 314 if ([icon_ size].width > extension_installed_bubble::kIconSize) { |
323 [icon_ setSize:NSMakeSize(extension_installed_bubble::kIconSize, | 315 [icon_ setSize:NSMakeSize(extension_installed_bubble::kIconSize, |
324 extension_installed_bubble::kIconSize)]; | 316 extension_installed_bubble::kIconSize)]; |
325 } | 317 } |
326 [iconImage_ setImage:icon_]; | 318 [iconImage_ setImage:icon_]; |
327 [iconImage_ setNeedsDisplay:YES]; | 319 [iconImage_ setNeedsDisplay:YES]; |
328 return window; | 320 return window; |
329 } | 321 } |
330 | 322 |
331 - (bool)hasActivePageAction:(extensions::Command*)command { | |
332 extensions::CommandService* command_service = | |
333 extensions::CommandService::Get(browser_->profile()); | |
334 if (type_ == extension_installed_bubble::kPageAction) { | |
335 if (extensions::CommandsInfo::GetPageActionCommand([self extension]) && | |
336 command_service->GetPageActionCommand( | |
337 [self extension]->id(), | |
338 extensions::CommandService::ACTIVE, | |
339 command, | |
340 NULL)) { | |
341 return true; | |
342 } | |
343 } | |
344 | |
345 return false; | |
346 } | |
347 | |
348 - (bool)hasActiveBrowserAction:(extensions::Command*)command { | |
349 extensions::CommandService* command_service = | |
350 extensions::CommandService::Get(browser_->profile()); | |
351 if (type_ == extension_installed_bubble::kBrowserAction) { | |
352 if (extensions::CommandsInfo::GetBrowserActionCommand([self extension]) && | |
353 command_service->GetBrowserActionCommand( | |
354 [self extension]->id(), | |
355 extensions::CommandService::ACTIVE, | |
356 command, | |
357 NULL)) { | |
358 return true; | |
359 } | |
360 } | |
361 | |
362 return false; | |
363 } | |
364 | |
365 - (NSString*)installMessageForCurrentExtensionAction { | |
366 if (type_ == extension_installed_bubble::kPageAction) { | |
367 extensions::Command page_action_command; | |
368 if ([self hasActivePageAction:&page_action_command]) { | |
369 return l10n_util::GetNSStringF( | |
370 IDS_EXTENSION_INSTALLED_PAGE_ACTION_INFO_WITH_SHORTCUT, | |
371 page_action_command.accelerator().GetShortcutText()); | |
372 } else { | |
373 return l10n_util::GetNSString( | |
374 IDS_EXTENSION_INSTALLED_PAGE_ACTION_INFO); | |
375 } | |
376 } else { | |
377 CHECK_EQ(extension_installed_bubble::kBrowserAction, type_); | |
378 extensions::Command browser_action_command; | |
379 if ([self hasActiveBrowserAction:&browser_action_command]) { | |
380 return l10n_util::GetNSStringF( | |
381 IDS_EXTENSION_INSTALLED_BROWSER_ACTION_INFO_WITH_SHORTCUT, | |
382 browser_action_command.accelerator().GetShortcutText()); | |
383 } else { | |
384 return l10n_util::GetNSString( | |
385 IDS_EXTENSION_INSTALLED_BROWSER_ACTION_INFO); | |
386 } | |
387 } | |
388 } | |
389 | |
390 // Calculate the height of each install message, resizing messages in their | 323 // Calculate the height of each install message, resizing messages in their |
391 // frames to fit window width. Return the new window height, based on the | 324 // frames to fit window width. Return the new window height, based on the |
392 // total of all message heights. | 325 // total of all message heights. |
393 - (int)calculateWindowHeight { | 326 - (int)calculateWindowHeight { |
394 // Adjust the window height to reflect the sum height of all messages | 327 // Adjust the window height to reflect the sum height of all messages |
395 // and vertical padding. | 328 // and vertical padding. |
396 int newWindowHeight = 2 * extension_installed_bubble::kOuterVerticalMargin; | 329 int newWindowHeight = 2 * extension_installed_bubble::kOuterVerticalMargin; |
397 | 330 |
398 // If type is bundle, list the extensions that were installed and those that | 331 // If type is bundle, list the extensions that were installed and those that |
399 // failed. | 332 // failed. |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 [heading_ setStringValue:l10n_util::GetNSStringF( | 385 [heading_ setStringValue:l10n_util::GetNSStringF( |
453 IDS_EXTENSION_INSTALLED_HEADING, extension_name)]; | 386 IDS_EXTENSION_INSTALLED_HEADING, extension_name)]; |
454 [GTMUILocalizerAndLayoutTweaker | 387 [GTMUILocalizerAndLayoutTweaker |
455 sizeToFitFixedWidthTextField:heading_]; | 388 sizeToFitFixedWidthTextField:heading_]; |
456 newWindowHeight += NSHeight([heading_ frame]) + | 389 newWindowHeight += NSHeight([heading_ frame]) + |
457 extension_installed_bubble::kInnerVerticalMargin; | 390 extension_installed_bubble::kInnerVerticalMargin; |
458 | 391 |
459 // If type is browser/page action, include a special message about them. | 392 // If type is browser/page action, include a special message about them. |
460 if (type_ == extension_installed_bubble::kBrowserAction || | 393 if (type_ == extension_installed_bubble::kBrowserAction || |
461 type_ == extension_installed_bubble::kPageAction) { | 394 type_ == extension_installed_bubble::kPageAction) { |
462 [howToUse_ setStringValue:[self | 395 [howToUse_ setStringValue:base::SysUTF16ToNSString( |
463 installMessageForCurrentExtensionAction]]; | 396 installedBubble_->GetHowToUseDescription())]; |
464 [howToUse_ setHidden:NO]; | 397 [howToUse_ setHidden:NO]; |
465 [[howToUse_ cell] | 398 [[howToUse_ cell] |
466 setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; | 399 setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; |
467 [GTMUILocalizerAndLayoutTweaker | 400 [GTMUILocalizerAndLayoutTweaker |
468 sizeToFitFixedWidthTextField:howToUse_]; | 401 sizeToFitFixedWidthTextField:howToUse_]; |
469 newWindowHeight += NSHeight([howToUse_ frame]) + | 402 newWindowHeight += NSHeight([howToUse_ frame]) + |
470 extension_installed_bubble::kInnerVerticalMargin; | 403 extension_installed_bubble::kInnerVerticalMargin; |
471 } | 404 } |
472 | 405 |
473 // If type is omnibox keyword, include a special message about the keyword. | 406 // If type is omnibox keyword, include a special message about the keyword. |
474 if (type_ == extension_installed_bubble::kOmniboxKeyword) { | 407 if (type_ == extension_installed_bubble::kOmniboxKeyword) { |
475 [howToUse_ setStringValue:l10n_util::GetNSStringF( | 408 [howToUse_ setStringValue:base::SysUTF16ToNSString( |
476 IDS_EXTENSION_INSTALLED_OMNIBOX_KEYWORD_INFO, | 409 installedBubble_->GetHowToUseDescription())]; |
477 base::UTF8ToUTF16(extensions::OmniboxInfo::GetKeyword( | |
478 [self extension])))]; | |
479 [howToUse_ setHidden:NO]; | 410 [howToUse_ setHidden:NO]; |
480 [[howToUse_ cell] | 411 [[howToUse_ cell] |
481 setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; | 412 setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; |
482 [GTMUILocalizerAndLayoutTweaker | 413 [GTMUILocalizerAndLayoutTweaker |
483 sizeToFitFixedWidthTextField:howToUse_]; | 414 sizeToFitFixedWidthTextField:howToUse_]; |
484 newWindowHeight += NSHeight([howToUse_ frame]) + | 415 newWindowHeight += NSHeight([howToUse_ frame]) + |
485 extension_installed_bubble::kInnerVerticalMargin; | 416 extension_installed_bubble::kInnerVerticalMargin; |
486 } | 417 } |
487 | 418 |
488 // If type is app, hide howToManage_, and include a "show me" link in the | 419 // If type is app, hide howToManage_, and include a "show me" link in the |
(...skipping 14 matching lines...) Expand all Loading... |
503 | 434 |
504 // Sync sign-in promo, if any. | 435 // Sync sign-in promo, if any. |
505 if (sync_promo_height > 0) { | 436 if (sync_promo_height > 0) { |
506 NSRect promo_frame = [promo_.get() frame]; | 437 NSRect promo_frame = [promo_.get() frame]; |
507 promo_frame.size.height = sync_promo_height; | 438 promo_frame.size.height = sync_promo_height; |
508 [promo_.get() setFrame:promo_frame]; | 439 [promo_.get() setFrame:promo_frame]; |
509 newWindowHeight += extension_installed_bubble::kInnerVerticalMargin; | 440 newWindowHeight += extension_installed_bubble::kInnerVerticalMargin; |
510 newWindowHeight += sync_promo_height; | 441 newWindowHeight += sync_promo_height; |
511 } | 442 } |
512 | 443 |
513 extensions::Command command; | 444 if (installedBubble_->has_command_keybinding()) { |
514 if ([self hasActivePageAction:&command] || | |
515 [self hasActiveBrowserAction:&command]) { | |
516 [manageShortcutLink_ setHidden:NO]; | 445 [manageShortcutLink_ setHidden:NO]; |
517 [[manageShortcutLink_ cell] | 446 [[manageShortcutLink_ cell] |
518 setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; | 447 setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; |
519 [[manageShortcutLink_ cell] | 448 [[manageShortcutLink_ cell] |
520 setTextColor:gfx::SkColorToCalibratedNSColor( | 449 setTextColor:gfx::SkColorToCalibratedNSColor( |
521 chrome_style::GetLinkColor())]; | 450 chrome_style::GetLinkColor())]; |
522 [GTMUILocalizerAndLayoutTweaker sizeToFitView:manageShortcutLink_]; | 451 [GTMUILocalizerAndLayoutTweaker sizeToFitView:manageShortcutLink_]; |
523 newWindowHeight += extension_installed_bubble::kInnerVerticalMargin; | 452 newWindowHeight += extension_installed_bubble::kInnerVerticalMargin; |
524 newWindowHeight += NSHeight([manageShortcutLink_ frame]); | 453 newWindowHeight += NSHeight([manageShortcutLink_ frame]); |
525 } | 454 } |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 [howToManage_ setFrame:howToManageFrame]; | 549 [howToManage_ setFrame:howToManageFrame]; |
621 | 550 |
622 NSRect frame = howToManageFrame; | 551 NSRect frame = howToManageFrame; |
623 if ([self showSyncPromo]) { | 552 if ([self showSyncPromo]) { |
624 frame = [promo_.get() frame]; | 553 frame = [promo_.get() frame]; |
625 frame.origin.y = NSMinY(howToManageFrame) - | 554 frame.origin.y = NSMinY(howToManageFrame) - |
626 (NSHeight(frame) + extension_installed_bubble::kInnerVerticalMargin); | 555 (NSHeight(frame) + extension_installed_bubble::kInnerVerticalMargin); |
627 [promo_.get() setFrame:frame]; | 556 [promo_.get() setFrame:frame]; |
628 } | 557 } |
629 | 558 |
630 extensions::Command command; | |
631 if (![manageShortcutLink_ isHidden]) { | 559 if (![manageShortcutLink_ isHidden]) { |
632 NSRect manageShortcutFrame = [manageShortcutLink_ frame]; | 560 NSRect manageShortcutFrame = [manageShortcutLink_ frame]; |
633 manageShortcutFrame.origin.y = NSMinY(frame) - ( | 561 manageShortcutFrame.origin.y = NSMinY(frame) - ( |
634 NSHeight(manageShortcutFrame) + | 562 NSHeight(manageShortcutFrame) + |
635 extension_installed_bubble::kInnerVerticalMargin); | 563 extension_installed_bubble::kInnerVerticalMargin); |
636 // Right-align the link. | 564 // Right-align the link. |
637 manageShortcutFrame.origin.x = NSMaxX(frame) - | 565 manageShortcutFrame.origin.x = NSMaxX(frame) - |
638 NSWidth(manageShortcutFrame); | 566 NSWidth(manageShortcutFrame); |
639 [manageShortcutLink_ setFrame:manageShortcutFrame]; | 567 [manageShortcutLink_ setFrame:manageShortcutFrame]; |
640 } | 568 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
676 install_ui->OpenAppInstalledUI([self extension]->id()); | 604 install_ui->OpenAppInstalledUI([self extension]->id()); |
677 } | 605 } |
678 | 606 |
679 - (void)awakeFromNib { | 607 - (void)awakeFromNib { |
680 if (bundle_) | 608 if (bundle_) |
681 return; | 609 return; |
682 [self initializeLabel]; | 610 [self initializeLabel]; |
683 } | 611 } |
684 | 612 |
685 @end | 613 @end |
OLD | NEW |