Commit 1db95be7 authored by Erik Chen's avatar Erik Chen Committed by Commit Bot

Replace Content Shell MainMenu.xib with programmatic construction.

MainMenu.xib primarily consisted of unusable menu items. This CL pulls out the
essentials, and drops support for the rest.

This CL intentionally keeps the logic simple with no additional abstraction
layers. While it would be reasonably simple to reuse chrome's
main_menu_builder.h or to pull out common functionality into builder functions,
the actual lines of code saved would be small and I'd like to avoid unnecessary
abstractions.

Change-Id: I3de68bd6fe3e064b7f83b038688cfbaf0bc4e9e1
Bug: 965663
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1627242Reviewed-by: default avatarRobert Sesek <rsesek@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Commit-Queue: Avi Drissman <avi@chromium.org>
Auto-Submit: Erik Chen <erikchen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#662943}
parent 06bc2f0b
......@@ -663,7 +663,6 @@ if (is_mac) {
mac_xib_bundle_data("content_shell_framework_xibs") {
sources = [
"app/English.lproj/HttpAuth.xib",
"app/English.lproj/MainMenu.xib",
]
output_path = "{{bundle_resources_dir}}/English.lproj"
}
......
This diff is collapsed.
......@@ -20,8 +20,6 @@
<string>APPL</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>LSFileQuarantineEnabled</key>
......
......@@ -10,16 +10,128 @@
#include "base/mac/scoped_nsobject.h"
#include "base/mac/sdk_forward_declarations.h"
namespace {
base::scoped_nsobject<NSMenuItem> CreateMenuItem(NSString* title,
SEL action,
NSString* key_equivalent) {
return base::scoped_nsobject<NSMenuItem>([[NSMenuItem alloc]
initWithTitle:title
action:action
keyEquivalent:key_equivalent]);
}
// The App Menu refers to the dropdown titled "Content Shell".
base::scoped_nsobject<NSMenu> BuildAppMenu() {
// The title is not used, as the title will always be the name of the App.
base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] initWithTitle:@""]);
base::scoped_nsobject<NSMenuItem> item =
CreateMenuItem(@"Hide Content Shell", @selector(hide:), @"h");
[menu addItem:item];
item =
CreateMenuItem(@"Hide Others", @selector(hideOtherApplications:), @"h");
item.get().keyEquivalentModifierMask =
NSEventModifierFlagOption | NSEventModifierFlagCommand;
[menu addItem:item];
item = CreateMenuItem(@"Show All", @selector(unhideAllApplications:), @"");
[menu addItem:item];
item = CreateMenuItem(@"Quit Content Shell", @selector(terminate:), @"q");
[menu addItem:item];
return menu;
}
base::scoped_nsobject<NSMenu> BuildFileMenu() {
base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] initWithTitle:@"File"]);
base::scoped_nsobject<NSMenuItem> item =
CreateMenuItem(@"New", @selector(newDocument:), @"n");
[menu addItem:item];
item = CreateMenuItem(@"Close", @selector(performClose:), @"w");
[menu addItem:item];
return menu;
}
base::scoped_nsobject<NSMenu> BuildEditMenu() {
base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] initWithTitle:@"Edit"]);
base::scoped_nsobject<NSMenuItem> item =
CreateMenuItem(@"Undo", @selector(undo:), @"z");
[menu addItem:item];
item = CreateMenuItem(@"Redo", @selector(redo:), @"Z");
[menu addItem:item];
item = CreateMenuItem(@"Cut", @selector(cut:), @"x");
[menu addItem:item];
item = CreateMenuItem(@"Copy", @selector(copy:), @"c");
[menu addItem:item];
item = CreateMenuItem(@"Paste", @selector(paste:), @"v");
[menu addItem:item];
item = CreateMenuItem(@"Select All", @selector(selectAll:), @"a");
[menu addItem:item];
return menu;
}
base::scoped_nsobject<NSMenu> BuildViewMenu() {
// AppKit auto-populates this menu.
base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] initWithTitle:@"View"]);
return menu;
}
base::scoped_nsobject<NSMenu> BuildDebugMenu() {
base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] initWithTitle:@"Debug"]);
base::scoped_nsobject<NSMenuItem> item =
CreateMenuItem(@"Show Developer Tools", @selector(showDevTools:), @"");
[menu addItem:item];
return menu;
}
base::scoped_nsobject<NSMenu> BuildWindowMenu() {
base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] initWithTitle:@"Window"]);
base::scoped_nsobject<NSMenuItem> item =
CreateMenuItem(@"Minimize", @selector(performMiniaturize:), @"m");
[menu addItem:item];
item = CreateMenuItem(@"Zoom", @selector(performZoom:), @"");
[menu addItem:item];
item = CreateMenuItem(@"Bring All To Front", @selector(arrangeInFront:), @"");
[menu addItem:item];
return menu;
}
base::scoped_nsobject<NSMenu> BuildMainMenu() {
base::scoped_nsobject<NSMenu> main_menu([[NSMenu alloc] initWithTitle:@""]);
using Builder = base::scoped_nsobject<NSMenu> (*)();
static const Builder kBuilderFuncs[] = {&BuildAppMenu, &BuildFileMenu,
&BuildEditMenu, &BuildViewMenu,
&BuildDebugMenu, &BuildWindowMenu};
for (auto* builder : kBuilderFuncs) {
NSMenuItem* item = [[[NSMenuItem alloc] initWithTitle:@""
action:NULL
keyEquivalent:@""] autorelease];
item.submenu = builder();
[main_menu addItem:item];
}
return main_menu;
}
} // namespace
namespace content {
void ShellBrowserMainParts::PreMainMessageLoopStart() {
base::scoped_nsobject<NSNib> nib(
[[NSNib alloc] initWithNibNamed:@"MainMenu"
bundle:base::mac::FrameworkBundle()]);
NSArray* top_level_objects = nil;
[nib instantiateWithOwner:NSApp topLevelObjects:nil];
for (NSObject* object : top_level_objects)
[object retain];
base::scoped_nsobject<NSMenu> main_menu = BuildMainMenu();
[[NSApplication sharedApplication] setMainMenu:main_menu];
}
} // namespace content
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment