Index: chrome/browser/app_controller_mac.mm |
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm |
index c25cdff5ee4a28581391eb6fe8b7af63a3fb5e5d..428f3758ba8d929bd68883709272cf1ee7bb1bf0 100644 |
--- a/chrome/browser/app_controller_mac.mm |
+++ b/chrome/browser/app_controller_mac.mm |
@@ -14,6 +14,7 @@ |
#include "base/string_number_conversions.h" |
#include "base/sys_string_conversions.h" |
#include "chrome/app/chrome_command_ids.h" |
+#include "chrome/browser/background_application_list_model.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/browser_shutdown.h" |
#include "chrome/browser/browser_thread.h" |
@@ -154,6 +155,7 @@ void RecordLastRunAppBundlePath() { |
- (void)showPreferencesWindow:(id)sender |
page:(OptionsPage)page |
profile:(Profile*)profile; |
+- (void)executeApplication:(id)sender; |
@end |
@implementation AppController |
@@ -792,7 +794,7 @@ void RecordLastRunAppBundlePath() { |
enable = YES; |
} else if (action == @selector(orderFrontStandardAboutPanel:)) { |
enable = YES; |
- } else if (action == @selector(newWindowFromDock:)) { |
+ } else if (action == @selector(commandFromDock:)) { |
enable = YES; |
} |
return enable; |
@@ -928,7 +930,30 @@ void RecordLastRunAppBundlePath() { |
case IDC_OPTIONS: |
[self showPreferences:sender]; |
break; |
+ default: |
+ // Background Applications use dynamic values that must be less than the |
+ // smallest value among the predefined IDC_* labels. |
+ if ([sender tag] < IDC_MinimumLabelValue) |
+ [self executeApplication:sender]; |
+ break; |
+ } |
+} |
+ |
+// Run a (background) application in a new tab. |
+- (void)executeApplication:(id)sender { |
+ NSInteger tag = [sender tag]; |
+ Profile* profile = [self defaultProfile]; |
+ DCHECK(profile); |
+ BackgroundApplicationListModel applications(profile); |
+ DCHECK(tag >= 0 && |
+ tag < static_cast<int>(applications.size())); |
+ Browser* browser = BrowserList::GetLastActive(); |
+ if (!browser) { |
+ Browser::OpenEmptyWindow(profile); |
+ browser = BrowserList::GetLastActive(); |
} |
+ const Extension* extension = applications.GetExtension(tag); |
+ browser->OpenApplicationTab(profile, extension, NULL); |
} |
// Same as |-commandDispatch:|, but executes commands using a disposition |
@@ -1162,25 +1187,52 @@ void RecordLastRunAppBundlePath() { |
} |
// Explicitly bring to the foreground when creating new windows from the dock. |
-- (void)newWindowFromDock:(id)sender { |
+- (void)commandFromDock:(id)sender { |
[NSApp activateIgnoringOtherApps:YES]; |
[self commandDispatch:sender]; |
} |
- (NSMenu*)applicationDockMenu:(NSApplication*)sender { |
NSMenu* dockMenu = [[[NSMenu alloc] initWithTitle: @""] autorelease]; |
+ Profile* profile = [self defaultProfile]; |
+ |
+ // TODO(rickcam): Mock out BackgroundApplicationListModel, then add unit |
+ // tests which use the mock in place of the profile-initialized model. |
+ |
+ // Avoid breaking unit tests which have no profile. |
+ if (profile) { |
+ int position = 0; |
+ BackgroundApplicationListModel applications(profile); |
+ for (ExtensionList::const_iterator cursor = applications.begin(); |
+ cursor != applications.end(); |
+ ++cursor, ++position) { |
+ DCHECK(position == applications.GetPosition(*cursor)); |
+ scoped_nsobject<NSMenuItem> appItem([[NSMenuItem alloc] |
+ initWithTitle:base::SysUTF16ToNSString(UTF8ToUTF16((*cursor)->name())) |
+ action:@selector(commandFromDock:) |
+ keyEquivalent:@""]); |
+ [appItem setTarget:self]; |
+ [appItem setTag:position]; |
+ [dockMenu addItem:appItem]; |
+ } |
+ if (applications.begin() != applications.end()) { |
+ NSMenuItem* sepItem = [[NSMenuItem separatorItem] init]; |
+ [dockMenu addItem:sepItem]; |
+ } |
+ } |
+ |
NSString* titleStr = l10n_util::GetNSStringWithFixup(IDS_NEW_WINDOW_MAC); |
scoped_nsobject<NSMenuItem> item([[NSMenuItem alloc] |
- initWithTitle:titleStr |
- action:@selector(newWindowFromDock:) |
- keyEquivalent:@""]); |
+ initWithTitle:titleStr |
+ action:@selector(commandFromDock:) |
+ keyEquivalent:@""]); |
[item setTarget:self]; |
[item setTag:IDC_NEW_WINDOW]; |
[dockMenu addItem:item]; |
titleStr = l10n_util::GetNSStringWithFixup(IDS_NEW_INCOGNITO_WINDOW_MAC); |
item.reset([[NSMenuItem alloc] initWithTitle:titleStr |
- action:@selector(newWindowFromDock:) |
+ action:@selector(commandFromDock:) |
keyEquivalent:@""]); |
[item setTarget:self]; |
[item setTag:IDC_NEW_INCOGNITO_WINDOW]; |