cf4b4747cd93907e4e7c756aefdb51253d7672ee
[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/WebHistory.h>
32 #import <WebKit/WebKit2.h>
33
34 enum {
35     WebKit1NewWindowTag = 1,
36     WebKit2NewWindowTag = 2
37 };
38
39 @implementation BrowserAppDelegate {
40     NSMutableSet *_browserWindowControllers;
41 }
42
43 - (id)init
44 {
45     self = [super init];
46     if (self) {
47         _browserWindowControllers = [[NSMutableSet alloc] init];
48     }
49
50     return self;
51 }
52
53 - (void)awakeFromNib
54 {
55     NSMenuItem *item = [[NSMenuItem alloc] init];
56     [item setSubmenu:[[SettingsController shared] menu]];
57     [[NSApp mainMenu] insertItem:[item autorelease] atIndex:[[NSApp mainMenu] indexOfItemWithTitle:@"Debug"]];
58 }
59
60 - (IBAction)newWindow:(id)sender
61 {
62     BrowserWindowController *controller = nil;
63
64     BOOL useWebKit2 = NO;
65
66     if (![sender respondsToSelector:@selector(tag)])
67         useWebKit2 = [SettingsController shared].useWebKit2ByDefault;
68     else
69         useWebKit2 = [sender tag] == WebKit2NewWindowTag;
70     
71     if (!useWebKit2)
72         controller = [[WK1BrowserWindowController alloc] initWithWindowNibName:@"BrowserWindow"];
73 #if WK_API_ENABLED
74     else
75         controller = [[WK2BrowserWindowController alloc] initWithWindowNibName:@"BrowserWindow"];
76 #endif
77     if (!controller)
78         return;
79
80     [[controller window] makeKeyAndOrderFront:sender];
81     [_browserWindowControllers addObject:controller];
82     
83     [controller loadURLString:[SettingsController shared].defaultURL];
84 }
85
86 - (void)browserWindowWillClose:(NSWindow *)window
87 {
88     [_browserWindowControllers removeObject:window.windowController];
89 }
90
91 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
92 {
93     WebHistory *webHistory = [[WebHistory alloc] init];
94     [WebHistory setOptionalSharedHistory:webHistory];
95     [webHistory release];
96
97     [self _updateNewWindowKeyEquivalents];
98
99     [self newWindow:self];
100 }
101
102 - (void)applicationWillTerminate:(NSNotification *)notification
103 {
104     for (BrowserWindowController* controller in _browserWindowControllers)
105         [controller applicationTerminating];
106 }
107
108 - (BrowserWindowController *)frontmostBrowserWindowController
109 {
110     for (NSWindow* window in [NSApp windows]) {
111         id delegate = [window delegate];
112
113         if (![delegate isKindOfClass:[BrowserWindowController class]])
114             continue;
115
116         BrowserWindowController *controller = (BrowserWindowController *)delegate;
117         assert([_browserWindowControllers containsObject:controller]);
118         return controller;
119     }
120
121     return nil;
122 }
123
124 - (IBAction)openDocument:(id)sender
125 {
126     BrowserWindowController *browserWindowController = [self frontmostBrowserWindowController];
127
128     if (browserWindowController) {
129         NSOpenPanel *openPanel = [[NSOpenPanel openPanel] retain];
130         [openPanel beginSheetModalForWindow:browserWindowController.window completionHandler:^(NSInteger result) {
131             if (result != NSOKButton)
132                 return;
133
134             NSURL *url = [openPanel.URLs objectAtIndex:0];
135             [browserWindowController loadURLString:[url absoluteString]];
136         }];
137         return;
138     }
139
140     NSOpenPanel *openPanel = [NSOpenPanel openPanel];
141     [openPanel beginWithCompletionHandler:^(NSInteger result) {
142         if (result != NSOKButton)
143             return;
144
145         BrowserWindowController *newBrowserWindowController = [[WK1BrowserWindowController alloc] initWithWindowNibName:@"BrowserWindow"];
146         [newBrowserWindowController.window makeKeyAndOrderFront:self];
147
148         NSURL *url = [openPanel.URLs objectAtIndex:0];
149         [newBrowserWindowController loadURLString:[url absoluteString]];
150     }];
151 }
152
153 - (void)didChangeSettings
154 {
155     [self _updateNewWindowKeyEquivalents];
156
157     // Let all of the BrowserWindowControllers know that a setting changed, so they can attempt to dynamically update.
158     for (BrowserWindowController<BrowserController> *browserWindowController in _browserWindowControllers)
159         [browserWindowController didChangeSettings];
160 }
161
162 - (void)_updateNewWindowKeyEquivalents
163 {
164     if ([[SettingsController shared] useWebKit2ByDefault]) {
165         [_newWebKit1WindowItem setKeyEquivalentModifierMask:NSCommandKeyMask | NSAlternateKeyMask];
166         [_newWebKit2WindowItem setKeyEquivalentModifierMask:NSCommandKeyMask];
167     } else {
168         [_newWebKit1WindowItem setKeyEquivalentModifierMask:NSCommandKeyMask];
169         [_newWebKit2WindowItem setKeyEquivalentModifierMask:NSCommandKeyMask | NSAlternateKeyMask];
170     }
171 }
172
173 @end