Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplify MiniBrowser settings menu construction #5992

Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
247 changes: 104 additions & 143 deletions Tools/MiniBrowser/mac/SettingsController.m
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,6 @@ typedef NS_ENUM(NSInteger, DebugOverylayMenuItemTag) {
InternalDebugFeatureTag,
};

@interface SettingsController ()
@property (nonatomic, retain) NSMenu *menu;
@end

@implementation SettingsController

- (instancetype)initWithMenu:(NSMenu *)menu
Expand All @@ -95,8 +91,6 @@ - (instancetype)initWithMenu:(NSMenu *)menu
if (!self)
return nil;

_menu = [menu retain];

NSArray *onByDefaultPrefs = @[
UseWebKit2ByDefaultPreferenceKey,
AcceleratedDrawingEnabledPreferenceKey,
Expand All @@ -113,154 +107,120 @@ - (instancetype)initWithMenu:(NSMenu *)menu
[userDefaults setBool:YES forKey:prefName];
}

[self _populateMenu];
[self _populateMenu:menu];

return self;
}

- (void)dealloc
static NSMenuItem *addItemToMenuWithTarget(NSMenu *menu, NSString *title, id target, SEL action, BOOL indent, NSInteger tag)
{
[_menu release];
[super dealloc];
NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:title action:action keyEquivalent:@""] autorelease];
if (action)
item.target = target;
if (tag)
item.tag = tag;
if (indent)
item.indentationLevel = 1;
[menu addItem:item];
return item;
}

- (void)_addItemWithTitle:(NSString *)title action:(SEL)action indented:(BOOL)indented
static void addSeparatorToMenu(NSMenu *menu)
{
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:title action:action keyEquivalent:@""];
[item setTarget:self];
if (indented)
[item setIndentationLevel:1];
[_menu addItem:item];
[item release];
[menu addItem:[NSMenuItem separatorItem]];
}

- (void)_addHeaderWithTitle:(NSString *)title
static NSMenu *addSubmenuToMenu(NSMenu *menu, NSString *title)
{
[_menu addItem:[NSMenuItem separatorItem]];
[_menu addItem:[[[NSMenuItem alloc] initWithTitle:title action:nil keyEquivalent:@""] autorelease]];
NSMenuItem *submenuItem = [[[NSMenuItem alloc] initWithTitle:title action:nil keyEquivalent:@""] autorelease];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to ARCify MiniBrowser code.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, may do that at some point.

NSMenu *submenu = [[[NSMenu alloc] initWithTitle:title] autorelease];
[submenuItem setSubmenu:submenu];
[menu addItem:submenuItem];
return submenu;
}

- (void)_populateMenu
- (void)_populateMenu:(NSMenu *)menu
{
[self _addItemWithTitle:@"Use WebKit2 By Default" action:@selector(toggleUseWebKit2ByDefault:) indented:NO];
[self _addItemWithTitle:@"Create Editor By Default" action:@selector(toggleCreateEditorByDefault:) indented:NO];
[self _addItemWithTitle:@"Set Default URL to Current URL" action:@selector(setDefaultURLToCurrentURL:) indented:NO];
__block bool indent = false;

[_menu addItem:[NSMenuItem separatorItem]];
__auto_type addItemToMenu = ^(NSMenu *menu, NSString *title, SEL action, BOOL indent, NSInteger tag) {
return addItemToMenuWithTarget(menu, title, self, action, indent, 0);
};

NSMenuItem *userAgentSubmenuItem = [[NSMenuItem alloc] initWithTitle:@"User Agent" action:nil keyEquivalent:@""];
NSMenu *userAgentMenu = [[NSMenu alloc] initWithTitle:@"User Agent"];
[self buildUserAgentsMenu:userAgentMenu];
[userAgentSubmenuItem setSubmenu:userAgentMenu];
[_menu addItem:userAgentSubmenuItem];
[userAgentMenu release];
[userAgentSubmenuItem release];

[_menu addItem:[NSMenuItem separatorItem]];

[self _addItemWithTitle:@"Use Transparent Windows" action:@selector(toggleUseTransparentWindows:) indented:NO];
[self _addItemWithTitle:@"Use Paginated Mode" action:@selector(toggleUsePaginatedMode:) indented:NO];
[self _addItemWithTitle:@"Show Layer Borders" action:@selector(toggleShowLayerBorders:) indented:NO];
[self _addItemWithTitle:@"Enable Legacy Line Layout Visual Coverage" action:@selector(toggleLegacyLineLayoutVisualCoverageEnabled:) indented:NO];
[self _addItemWithTitle:@"Suppress Incremental Rendering in New Windows" action:@selector(toggleIncrementalRenderingSuppressed:) indented:NO];
[self _addItemWithTitle:@"Enable Accelerated Drawing" action:@selector(toggleAcceleratedDrawingEnabled:) indented:NO];
[self _addItemWithTitle:@"Enable Display List Drawing" action:@selector(toggleDisplayListDrawingEnabled:) indented:NO];
[self _addItemWithTitle:@"Enable Subpixel-antialiased Layer Text" action:@selector(toggleSubpixelAntialiasedLayerTextEnabled:) indented:NO];
[self _addItemWithTitle:@"Enable Resource Load Statistics" action:@selector(toggleResourceLoadStatisticsEnabled:) indented:NO];
[self _addItemWithTitle:@"Enable Large Image Async Decoding" action:@selector(toggleLargeImageAsyncDecodingEnabled:) indented:NO];
[self _addItemWithTitle:@"Enable Animated Image Async Decoding" action:@selector(toggleAnimatedImageAsyncDecodingEnabled:) indented:NO];
[self _addItemWithTitle:@"Enable color-filter" action:@selector(toggleAppleColorFilterEnabled:) indented:NO];
[self _addItemWithTitle:@"Punch Out White Backgrounds in Dark Mode" action:@selector(togglePunchOutWhiteBackgroundsInDarkMode:) indented:NO];
[self _addItemWithTitle:@"Use System Appearance" action:@selector(toggleUseSystemAppearance:) indented:NO];
[self _addHeaderWithTitle:@"WebKit2-only Settings"];

[self _addItemWithTitle:@"Reserve Space For Banners" action:@selector(toggleReserveSpaceForBanners:) indented:YES];
[self _addItemWithTitle:@"Show Tiled Scrolling Indicator" action:@selector(toggleShowTiledScrollingIndicator:) indented:YES];
[self _addItemWithTitle:@"Use UI-Side Compositing" action:@selector(toggleUseUISideCompositing:) indented:YES];
[self _addItemWithTitle:@"Disable Per-Window Web Processes" action:@selector(togglePerWindowWebProcessesDisabled:) indented:YES];
[self _addItemWithTitle:@"Show Resource Usage Overlay" action:@selector(toggleShowResourceUsageOverlay:) indented:YES];
[self _addItemWithTitle:@"Load All Site Icons Per-Page" action:@selector(toggleLoadsAllSiteIcons:) indented:YES];
[self _addItemWithTitle:@"Use GameController.framework on macOS (Restart required)" action:@selector(toggleUsesGameControllerFramework:) indented:YES];
[self _addItemWithTitle:@"Disable network cache speculative revalidation" action:@selector(toggleNetworkCacheSpeculativeRevalidationDisabled:) indented:YES];
[self _addItemWithTitle:@"Enable Process Swap on window.open() with an opener" action:@selector(toggleProcessSwapOnWindowOpenWithOpener:) indented:YES];

NSMenuItem *debugOverlaysSubmenuItem = [[NSMenuItem alloc] initWithTitle:@"Debug Overlays" action:nil keyEquivalent:@""];
NSMenu *debugOverlaysMenu = [[NSMenu alloc] initWithTitle:@"Debug Overlays"];
[debugOverlaysSubmenuItem setSubmenu:debugOverlaysMenu];

NSMenuItem *nonFastScrollableRegionItem = [[NSMenuItem alloc] initWithTitle:@"Non-fast Scrollable Region" action:@selector(toggleDebugOverlay:) keyEquivalent:@""];
[nonFastScrollableRegionItem setTag:NonFastScrollableRegionOverlayTag];
[nonFastScrollableRegionItem setTarget:self];
[debugOverlaysMenu addItem:[nonFastScrollableRegionItem autorelease]];

NSMenuItem *wheelEventHandlerRegionItem = [[NSMenuItem alloc] initWithTitle:@"Wheel Event Handler Region" action:@selector(toggleDebugOverlay:) keyEquivalent:@""];
[wheelEventHandlerRegionItem setTag:WheelEventHandlerRegionOverlayTag];
[wheelEventHandlerRegionItem setTarget:self];
[debugOverlaysMenu addItem:[wheelEventHandlerRegionItem autorelease]];

NSMenuItem *interactionRegionItem = [[NSMenuItem alloc] initWithTitle:@"Interaction Region" action:@selector(toggleDebugOverlay:) keyEquivalent:@""];
[interactionRegionItem setTag:InteractionRegionOverlayTag];
[interactionRegionItem setTarget:self];
[debugOverlaysMenu addItem:[interactionRegionItem autorelease]];

[debugOverlaysMenu release];
__auto_type addItem = ^(NSString *title, SEL action) {
return addItemToMenu(menu, title, action, indent, 0);
};

__auto_type addSeparator = ^{
addSeparatorToMenu(menu);
};

__auto_type addSubmenu = ^(NSString *title) {
return addSubmenuToMenu(menu, title);
};

[_menu addItem:debugOverlaysSubmenuItem];
[debugOverlaysSubmenuItem release];
addItem(@"Use WebKit2 By Default", @selector(toggleUseWebKit2ByDefault:));
addItem(@"Create Editor By Default", @selector(toggleCreateEditorByDefault:));
addItem(@"Set Default URL to Current URL", @selector(setDefaultURLToCurrentURL:));

NSMenuItem *experimentalFeaturesSubmenuItem = [[NSMenuItem alloc] initWithTitle:@"Experimental Features" action:nil keyEquivalent:@""];
NSMenu *experimentalFeaturesMenu = [[NSMenu alloc] initWithTitle:@"Experimental Features"];
[experimentalFeaturesSubmenuItem setSubmenu:experimentalFeaturesMenu];
addSeparator();

NSArray<_WKExperimentalFeature *> *experimentalFeatures = [WKPreferences _experimentalFeatures];
NSMenu *userAgentMenu = addSubmenu(@"User Agent");
[self buildUserAgentsMenu:userAgentMenu];

for (_WKExperimentalFeature *feature in experimentalFeatures) {
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:feature.name action:@selector(toggleExperimentalFeature:) keyEquivalent:@""];
addSeparator();

addItem(@"Use Transparent Windows", @selector(toggleUseTransparentWindows:));
addItem(@"Use Paginated Mode", @selector(toggleUsePaginatedMode:));
addItem(@"Show Layer Borders", @selector(toggleShowLayerBorders:));
addItem(@"Enable Legacy Line Layout Visual Coverage", @selector(toggleLegacyLineLayoutVisualCoverageEnabled:));
addItem(@"Suppress Incremental Rendering in New Windows", @selector(toggleIncrementalRenderingSuppressed:));
addItem(@"Enable Accelerated Drawing", @selector(toggleAcceleratedDrawingEnabled:));
addItem(@"Enable Display List Drawing", @selector(toggleDisplayListDrawingEnabled:));
addItem(@"Enable Subpixel-antialiased Layer Text", @selector(toggleSubpixelAntialiasedLayerTextEnabled:));
addItem(@"Enable Resource Load Statistics", @selector(toggleResourceLoadStatisticsEnabled:));
addItem(@"Enable Large Image Async Decoding", @selector(toggleLargeImageAsyncDecodingEnabled:));
addItem(@"Enable Animated Image Async Decoding", @selector(toggleAnimatedImageAsyncDecodingEnabled:));
addItem(@"Enable color-filter", @selector(toggleAppleColorFilterEnabled:));
addItem(@"Punch Out White Backgrounds in Dark Mode", @selector(togglePunchOutWhiteBackgroundsInDarkMode:));
addItem(@"Use System Appearance", @selector(toggleUseSystemAppearance:));

addSeparator();
addItem(@"WebKit2-only Settings", nil);
indent = YES;
addItem(@"Reserve Space For Banners", @selector(toggleReserveSpaceForBanners:));
addItem(@"Show Tiled Scrolling Indicator", @selector(toggleShowTiledScrollingIndicator:));
addItem(@"Use UI-Side Compositing", @selector(toggleUseUISideCompositing:));
addItem(@"Disable Per-Window Web Processes", @selector(togglePerWindowWebProcessesDisabled:));
addItem(@"Load All Site Icons Per-Page", @selector(toggleLoadsAllSiteIcons:));
addItem(@"Use GameController.framework on macOS (Restart required)", @selector(toggleUsesGameControllerFramework:));
addItem(@"Disable network cache speculative revalidation", @selector(toggleNetworkCacheSpeculativeRevalidationDisabled:));
addItem(@"Enable Process Swap on window.open() with an opener", @selector(toggleProcessSwapOnWindowOpenWithOpener:));
indent = NO;

NSMenu *debugOverlaysMenu = addSubmenu(@"Debug Overlays");
addItemToMenu(debugOverlaysMenu, @"Non-fast Scrollable Region", @selector(toggleDebugOverlay:), NO, NonFastScrollableRegionOverlayTag);
addItemToMenu(debugOverlaysMenu, @"Wheel Event Handler Region", @selector(toggleDebugOverlay:), NO, WheelEventHandlerRegionOverlayTag);
addItemToMenu(debugOverlaysMenu, @"Interaction Region", @selector(toggleDebugOverlay:), NO, InteractionRegionOverlayTag);
addItemToMenu(debugOverlaysMenu, @"Resource Usage", @selector(toggleShowResourceUsageOverlay:), NO, 0);

NSMenu *experimentalFeaturesMenu = addSubmenu(@"Experimental Features");
for (_WKExperimentalFeature *feature in WKPreferences._experimentalFeatures) {
NSMenuItem *item = addItemToMenu(experimentalFeaturesMenu, feature.name, @selector(toggleExperimentalFeature:), NO, ExperimentalFeatureTag);
item.toolTip = feature.details;
item.representedObject = feature;

[item setTag:ExperimentalFeatureTag];
[item setTarget:self];
[experimentalFeaturesMenu addItem:[item autorelease]];
}
addSeparatorToMenu(experimentalFeaturesMenu);
addItemToMenu(experimentalFeaturesMenu, @"Reset All to Defaults", @selector(resetAllExperimentalFeatures:), NO, 0);

[experimentalFeaturesMenu addItem:[NSMenuItem separatorItem]];
NSMenuItem *resetExperimentalFeaturesToDefaultsItem = [[NSMenuItem alloc] initWithTitle:@"Reset All to Defaults" action:@selector(resetAllExperimentalFeatures:) keyEquivalent:@""];
[resetExperimentalFeaturesToDefaultsItem setTarget:self];
[experimentalFeaturesMenu addItem:resetExperimentalFeaturesToDefaultsItem];
[resetExperimentalFeaturesToDefaultsItem release];

[_menu addItem:experimentalFeaturesSubmenuItem];
[experimentalFeaturesSubmenuItem release];
[experimentalFeaturesMenu release];

NSMenuItem *internalDebugFeaturesSubmenuItem = [[NSMenuItem alloc] initWithTitle:@"Internal Features" action:nil keyEquivalent:@""];
NSMenu *internalDebugFeaturesMenu = [[NSMenu alloc] initWithTitle:@"Internal Features"];
[internalDebugFeaturesSubmenuItem setSubmenu:internalDebugFeaturesMenu];

NSArray<_WKInternalDebugFeature *> *internalDebugFeatures = [WKPreferences _internalDebugFeatures];

for (_WKInternalDebugFeature *feature in internalDebugFeatures) {
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:feature.name action:@selector(toggleInternalDebugFeature:) keyEquivalent:@""];
NSMenu *internalDebugFeaturesMenu = addSubmenu(@"Internal Features");
for (_WKInternalDebugFeature *feature in WKPreferences._internalDebugFeatures) {
NSMenuItem *item = addItemToMenu(internalDebugFeaturesMenu, feature.name, @selector(toggleInternalDebugFeature:), NO, InternalDebugFeatureTag);
item.toolTip = feature.details;
item.representedObject = feature;

[item setTag:InternalDebugFeatureTag];
[item setTarget:self];
[internalDebugFeaturesMenu addItem:[item autorelease]];
}

[internalDebugFeaturesMenu addItem:[NSMenuItem separatorItem]];
NSMenuItem *resetInternalFeaturesToDefaultsItem = [[NSMenuItem alloc] initWithTitle:@"Reset All to Defaults" action:@selector(resetAllInternalDebugFeatures:) keyEquivalent:@""];
[resetInternalFeaturesToDefaultsItem setTarget:self];
[internalDebugFeaturesMenu addItem:resetInternalFeaturesToDefaultsItem];
[resetInternalFeaturesToDefaultsItem release];

[_menu addItem:internalDebugFeaturesSubmenuItem];
[internalDebugFeaturesSubmenuItem release];
[internalDebugFeaturesMenu release];

[self _addHeaderWithTitle:@"WebKit1-only Settings"];
addSeparatorToMenu(internalDebugFeaturesMenu);
addItemToMenu(internalDebugFeaturesMenu, @"Reset All to Defaults", @selector(resetAllInternalDebugFeatures:), NO, 0);
}

+ (NSArray *)userAgentData
Expand Down Expand Up @@ -320,28 +280,29 @@ - (void)buildUserAgentsMenu:(NSMenu *)menu
@"identifier" : @"default",
};

NSMenuItem *menuItem = [[NSMenuItem alloc] initWithTitle:@"Default" action:@selector(changeCutomUserAgent:) keyEquivalent:@""];
[menuItem setTarget:self];
[menuItem setRepresentedObject:defaultUAInfo];
__auto_type addItem = ^(NSString *title, SEL action) {
return addItemToMenuWithTarget(menu, title, self, action, NO, 0);
};

[menu addItem:menuItem];
[menuItem release];
__auto_type addSeparator = ^{
addSeparatorToMenu(menu);
};

[menu addItem:[NSMenuItem separatorItem]];
NSMenuItem *defaultItem = addItem(@"Default", @selector(changeCustomUserAgent:));
defaultItem.representedObject = defaultUAInfo;

for (NSDictionary *userAgentData in [[self class] userAgentData]) {
addSeparator();

for (NSDictionary *userAgentData in SettingsController.userAgentData) {
NSString *name = userAgentData[@"label"];

if ([name isEqualToString:@"-"]) {
[menu addItem:[NSMenuItem separatorItem]];
addSeparator();
continue;
}

menuItem = [[NSMenuItem alloc] initWithTitle:name action:@selector(changeCutomUserAgent:) keyEquivalent:@""];
[menuItem setTarget:self];
[menuItem setRepresentedObject:userAgentData];
[menu addItem:menuItem];
[menuItem release];

NSMenuItem *item = addItem(name, @selector(changeCustomUserAgent:));
item.representedObject = userAgentData;
}
}

Expand Down Expand Up @@ -404,7 +365,7 @@ - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
[menuItem setState:[self perWindowWebProcessesDisabled] ? NSControlStateValueOn : NSControlStateValueOff];
else if (action == @selector(toggleDebugOverlay:))
[menuItem setState:[self debugOverlayVisible:menuItem] ? NSControlStateValueOn : NSControlStateValueOff];
else if (action == @selector(changeCutomUserAgent:)) {
else if (action == @selector(changeCustomUserAgent:)) {

NSString *savedUAIdentifier = [[NSUserDefaults standardUserDefaults] stringForKey:CustomUserAgentPreferenceKey];
NSDictionary *userAgentDict = [menuItem representedObject];
Expand Down Expand Up @@ -812,7 +773,7 @@ - (NSString *)customUserAgent
return nil;
}

- (void)changeCutomUserAgent:(id)sender
- (void)changeCustomUserAgent:(id)sender
{
NSDictionary *userAgentDict = [sender representedObject];
if (!userAgentDict)
Expand Down