bmalloc: Miscellaneous cleanup
[WebKit-https.git] / Tools / MiniBrowser / mac / AppDelegate.m
1 /*
2  * Copyright (C) 2010 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "AppDelegate.h"
27
28 #import "SettingsController.h"
29 #import "WK1BrowserWindowController.h"
30 #import "WK2BrowserWindowController.h"
31 #import <WebKit/WKPreferencesPrivate.h>
32 #import <WebKit/WKProcessPoolPrivate.h>
33 #import <WebKit/WKWebViewConfigurationPrivate.h>
34 #import <WebKit/WebKit.h>
35 #import <WebKit/_WKProcessPoolConfiguration.h>
36 #import <WebKit/_WKWebsiteDataStore.h>
37
38 enum {
39     WebKit1NewWindowTag = 1,
40     WebKit2NewWindowTag = 2
41 };
42
43 @implementation BrowserAppDelegate
44
45 - (id)init
46 {
47     self = [super init];
48     if (self) {
49         _browserWindowControllers = [[NSMutableSet alloc] init];
50     }
51
52     return self;
53 }
54
55 - (void)awakeFromNib
56 {
57     NSMenuItem *item = [[NSMenuItem alloc] init];
58     [item setSubmenu:[[SettingsController shared] menu]];
59     [[NSApp mainMenu] insertItem:[item autorelease] atIndex:[[NSApp mainMenu] indexOfItemWithTitle:@"Debug"]];
60 }
61
62 #if WK_API_ENABLED
63 static WKWebViewConfiguration *defaultConfiguration()
64 {
65     static WKWebViewConfiguration *configuration;
66
67     if (!configuration) {
68         configuration = [[WKWebViewConfiguration alloc] init];
69         configuration.preferences._fullScreenEnabled = YES;
70         configuration.preferences._developerExtrasEnabled = YES;
71
72         if ([SettingsController shared].perWindowWebProcessesDisabled) {
73             _WKProcessPoolConfiguration *singleProcessConfiguration = [[_WKProcessPoolConfiguration alloc] init];
74             singleProcessConfiguration.maximumProcessCount = 1;
75             configuration.processPool = [[[WKProcessPool alloc] _initWithConfiguration:singleProcessConfiguration] autorelease];
76             [singleProcessConfiguration release];
77         }
78     }
79
80     return configuration;
81 }
82 #endif
83
84
85 - (IBAction)newWindow:(id)sender
86 {
87     BrowserWindowController *controller = nil;
88
89     BOOL useWebKit2 = NO;
90
91     if (![sender respondsToSelector:@selector(tag)])
92         useWebKit2 = [SettingsController shared].useWebKit2ByDefault;
93     else
94         useWebKit2 = [sender tag] == WebKit2NewWindowTag;
95     
96     if (!useWebKit2)
97         controller = [[WK1BrowserWindowController alloc] initWithWindowNibName:@"BrowserWindow"];
98 #if WK_API_ENABLED
99     else
100         controller = [[WK2BrowserWindowController alloc] initWithConfiguration:defaultConfiguration()];
101 #endif
102     if (!controller)
103         return;
104
105     [[controller window] makeKeyAndOrderFront:sender];
106     [_browserWindowControllers addObject:controller];
107     
108     [controller loadURLString:[SettingsController shared].defaultURL];
109 }
110
111 - (IBAction)newPrivateWindow:(id)sender
112 {
113 #if WK_API_ENABLED
114     WKWebViewConfiguration *privateConfiguraton = [defaultConfiguration() copy];
115     privateConfiguraton._websiteDataStore = [_WKWebsiteDataStore nonPersistentDataStore];
116
117     BrowserWindowController *controller = [[WK2BrowserWindowController alloc] initWithConfiguration:privateConfiguraton];
118     [privateConfiguraton release];
119
120     [[controller window] makeKeyAndOrderFront:sender];
121     [_browserWindowControllers addObject:controller];
122
123     [controller loadURLString:[SettingsController shared].defaultURL];
124 #endif
125 }
126
127 - (void)browserWindowWillClose:(NSWindow *)window
128 {
129     [_browserWindowControllers removeObject:window.windowController];
130 }
131
132 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
133 {
134     WebHistory *webHistory = [[WebHistory alloc] init];
135     [WebHistory setOptionalSharedHistory:webHistory];
136     [webHistory release];
137
138     [self _updateNewWindowKeyEquivalents];
139
140     [self newWindow:self];
141 }
142
143 - (void)applicationWillTerminate:(NSNotification *)notification
144 {
145     for (BrowserWindowController* controller in _browserWindowControllers)
146         [controller applicationTerminating];
147 }
148
149 - (BrowserWindowController *)frontmostBrowserWindowController
150 {
151     for (NSWindow* window in [NSApp windows]) {
152         id delegate = [window delegate];
153
154         if (![delegate isKindOfClass:[BrowserWindowController class]])
155             continue;
156
157         BrowserWindowController *controller = (BrowserWindowController *)delegate;
158         assert([_browserWindowControllers containsObject:controller]);
159         return controller;
160     }
161
162     return nil;
163 }
164
165 - (IBAction)openDocument:(id)sender
166 {
167     BrowserWindowController *browserWindowController = [self frontmostBrowserWindowController];
168
169     if (browserWindowController) {
170         NSOpenPanel *openPanel = [[NSOpenPanel openPanel] retain];
171         [openPanel beginSheetModalForWindow:browserWindowController.window completionHandler:^(NSInteger result) {
172             if (result != NSFileHandlingPanelOKButton)
173                 return;
174
175             NSURL *url = [openPanel.URLs objectAtIndex:0];
176             [browserWindowController loadURLString:[url absoluteString]];
177         }];
178         return;
179     }
180
181     NSOpenPanel *openPanel = [NSOpenPanel openPanel];
182     [openPanel beginWithCompletionHandler:^(NSInteger result) {
183         if (result != NSFileHandlingPanelOKButton)
184             return;
185
186         BrowserWindowController *newBrowserWindowController = [[WK1BrowserWindowController alloc] initWithWindowNibName:@"BrowserWindow"];
187         [newBrowserWindowController.window makeKeyAndOrderFront:self];
188
189         NSURL *url = [openPanel.URLs objectAtIndex:0];
190         [newBrowserWindowController loadURLString:[url absoluteString]];
191     }];
192 }
193
194 - (void)didChangeSettings
195 {
196     [self _updateNewWindowKeyEquivalents];
197
198     // Let all of the BrowserWindowControllers know that a setting changed, so they can attempt to dynamically update.
199     for (BrowserWindowController<BrowserController> *browserWindowController in _browserWindowControllers)
200         [browserWindowController didChangeSettings];
201 }
202
203 - (void)_updateNewWindowKeyEquivalents
204 {
205     if ([[SettingsController shared] useWebKit2ByDefault]) {
206         [_newWebKit1WindowItem setKeyEquivalentModifierMask:NSCommandKeyMask | NSAlternateKeyMask];
207         [_newWebKit2WindowItem setKeyEquivalentModifierMask:NSCommandKeyMask];
208     } else {
209         [_newWebKit1WindowItem setKeyEquivalentModifierMask:NSCommandKeyMask];
210         [_newWebKit2WindowItem setKeyEquivalentModifierMask:NSCommandKeyMask | NSAlternateKeyMask];
211     }
212 }
213
214 @end