diff --git a/atom/browser/ui/cocoa/atom_menu_controller.h b/atom/browser/ui/cocoa/atom_menu_controller.h index a230437f536f..c1306dab6759 100644 --- a/atom/browser/ui/cocoa/atom_menu_controller.h +++ b/atom/browser/ui/cocoa/atom_menu_controller.h @@ -26,6 +26,7 @@ class AtomMenuModel; @protected atom::AtomMenuModel* model_; // weak base::scoped_nsobject menu_; + NSMenuItem* openRecentMenuItem_; BOOL isMenuOpen_; BOOL useDefaultAccelerator_; base::Callback closeCallback; diff --git a/atom/browser/ui/cocoa/atom_menu_controller.mm b/atom/browser/ui/cocoa/atom_menu_controller.mm index 8a3118880c2e..23385a6bd160 100644 --- a/atom/browser/ui/cocoa/atom_menu_controller.mm +++ b/atom/browser/ui/cocoa/atom_menu_controller.mm @@ -75,7 +75,10 @@ Role kRolesMap[] = { // while its context menu is still open. [self cancel]; - model_ = nullptr; + model_ = nil; + + [openRecentMenuItem_ release]; + [super dealloc]; } @@ -87,6 +90,13 @@ Role kRolesMap[] = { if (!menu_) return; + // Retain submenu for recent documents + if (!openRecentMenuItem_) { + openRecentMenuItem_ = [[[[NSApp mainMenu] + itemWithTitle:@"Electron"] submenu] itemWithTitle:@"Open Recent"]; + [openRecentMenuItem_ retain]; + } + model_ = model; [menu_ removeAllItems]; @@ -139,6 +149,17 @@ Role kRolesMap[] = { fromModel:(atom::AtomMenuModel*)model { base::string16 label16 = model->GetLabelAt(index); NSString* label = l10n_util::FixUpWindowsStyleLabel(label16); + base::string16 role = model->GetRoleAt(index); + + if (role == base::ASCIIToUTF16("openrecent")) { + // Special role for recent documents + [[openRecentMenuItem_ menu] removeItem:openRecentMenuItem_]; + [openRecentMenuItem_ setTitle:label]; + [[openRecentMenuItem_ submenu] setTitle:label]; + [menu insertItem:openRecentMenuItem_ atIndex:index]; + return; + } + base::scoped_nsobject item( [[NSMenuItem alloc] initWithTitle:label action:@selector(itemSelected:) @@ -161,7 +182,6 @@ Role kRolesMap[] = { [item setSubmenu:submenu]; // Set submenu's role. - base::string16 role = model->GetRoleAt(index); if (role == base::ASCIIToUTF16("window") && [submenu numberOfItems]) [NSApp setWindowsMenu:submenu]; else if (role == base::ASCIIToUTF16("help")) diff --git a/lib/browser/api/menu-item-roles.js b/lib/browser/api/menu-item-roles.js index af0d35b4a56a..f6fa06ba47a1 100644 --- a/lib/browser/api/menu-item-roles.js +++ b/lib/browser/api/menu-item-roles.js @@ -102,6 +102,9 @@ const roles = { services: { label: 'Services' }, + openrecent: { + label: 'Open Recent' + }, startspeaking: { label: 'Start Speaking' },