bmalloc: Miscellaneous cleanup
[WebKit-https.git] / Tools / MiniBrowser / mac / WK1BrowserWindowController.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 "WK1BrowserWindowController.h"
27
28 #import "AppDelegate.h"
29 #import "SettingsController.h"
30 #import <WebKit/WebKit.h>
31 #import <WebKit/WebPreferences.h>
32 #import <WebKit/WebPreferencesPrivate.h>
33 #import <WebKit/WebPreferenceKeysPrivate.h>
34 #import <WebKit/WebViewPrivate.h>
35
36 @interface WK1BrowserWindowController () <WebFrameLoadDelegate, WebPolicyDelegate, WebResourceLoadDelegate, WebUIDelegate>
37 @end
38
39 @implementation WK1BrowserWindowController
40
41 - (void)awakeFromNib
42 {
43     _webView = [[WebView alloc] initWithFrame:[containerView bounds] frameName:nil groupName:@"MiniBrowser"];
44     [_webView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
45
46     [_webView setFrameLoadDelegate:self];
47     [_webView setUIDelegate:self];
48     [_webView setResourceLoadDelegate:self];
49     [_webView setPolicyDelegate:self];
50
51     [[WebPreferences standardPreferences] setFullScreenEnabled:YES];
52     [[WebPreferences standardPreferences] setDeveloperExtrasEnabled:YES];
53     [[WebPreferences standardPreferences] setImageControlsEnabled:YES];
54     [[WebPreferences standardPreferences] setServiceControlsEnabled:YES];
55
56     [self didChangeSettings];
57
58     [containerView addSubview:_webView];
59 }
60
61 - (void)dealloc
62 {
63     [_webView setFrameLoadDelegate:nil];
64     [_webView setUIDelegate:nil];
65     [_webView setResourceLoadDelegate:nil];
66     [_webView release];
67
68     [super dealloc];
69 }
70
71 - (void)loadURLString:(NSString *)urlString
72 {
73     // FIXME: We shouldn't have to set the url text here.
74     [urlText setStringValue:urlString];
75     [self fetch:nil];
76 }
77
78 - (IBAction)fetch:(id)sender
79 {
80     [urlText setStringValue:[self addProtocolIfNecessary:[urlText stringValue]]];
81     NSURL *url = [NSURL URLWithString:[urlText stringValue]];
82     [[_webView mainFrame] loadRequest:[NSURLRequest requestWithURL:url]];
83 }
84
85 - (IBAction)showHideWebView:(id)sender
86 {
87     BOOL hidden = ![_webView isHidden];
88     
89     [_webView setHidden:hidden];
90 }
91
92 - (IBAction)removeReinsertWebView:(id)sender
93 {
94     if ([_webView window]) {
95         [_webView retain];
96         [_webView removeFromSuperview]; 
97     } else {
98         [containerView addSubview:_webView];
99         [_webView release];
100     }
101 }
102
103 - (IBAction)reload:(id)sender
104 {
105     [_webView reload:sender];
106 }
107
108 - (IBAction)forceRepaint:(id)sender
109 {
110     [_webView setNeedsDisplay:YES];
111 }
112
113 - (IBAction)goBack:(id)sender
114 {
115     [_webView goBack:sender];
116 }
117
118 - (IBAction)goForward:(id)sender
119 {
120     [_webView goForward:sender];
121 }
122
123 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
124 {
125     SEL action = [menuItem action];
126
127     if (action == @selector(zoomIn:))
128         return [self canZoomIn];
129     if (action == @selector(zoomOut:))
130         return [self canZoomOut];
131     if (action == @selector(resetZoom:))
132         return [self canResetZoom];
133
134     if (action == @selector(showHideWebView:))
135         [menuItem setTitle:[_webView isHidden] ? @"Show Web View" : @"Hide Web View"];
136     else if (action == @selector(removeReinsertWebView:))
137         [menuItem setTitle:[_webView window] ? @"Remove Web View" : @"Insert Web View"];
138     else if (action == @selector(toggleZoomMode:))
139         [menuItem setState:_zoomTextOnly ? NSOnState : NSOffState];
140
141     return YES;
142 }
143
144 - (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item
145 {
146     SEL action = [item action];
147
148     if (action == @selector(goBack:))
149         return [_webView canGoBack];
150     
151     if (action == @selector(goForward:))
152         return [_webView canGoForward];
153     
154     return YES;
155 }
156
157 - (void)validateToolbar
158 {
159     [toolbar validateVisibleItems];
160 }
161
162 - (BOOL)windowShouldClose:(id)sender
163 {
164     return YES;
165 }
166
167 - (void)windowWillClose:(NSNotification *)notification
168 {
169     [(BrowserAppDelegate *)[[NSApplication sharedApplication] delegate] browserWindowWillClose:self.window];
170     [self autorelease];
171 }
172
173 - (void)applicationTerminating
174 {
175 }
176
177 - (double)currentZoomFactor
178 {
179     return 1;
180 }
181
182 - (BOOL)canZoomIn
183 {
184     return [_webView canMakeTextLarger];
185 }
186
187 - (void)zoomIn:(id)sender
188 {
189     if (![self canZoomIn])
190         return;
191
192     [_webView makeTextLarger:sender];
193 }
194
195 - (BOOL)canZoomOut
196 {
197     return [_webView canMakeTextSmaller];
198 }
199
200 - (void)zoomOut:(id)sender
201 {
202     if (![self canZoomIn])
203         return;
204
205     [_webView makeTextSmaller:sender];
206 }
207
208 - (BOOL)canResetZoom
209 {
210     return [_webView canMakeTextStandardSize];
211 }
212
213 - (void)resetZoom:(id)sender
214 {
215     if (![self canResetZoom])
216         return;
217
218     [_webView makeTextStandardSize:sender];
219 }
220
221 - (IBAction)toggleZoomMode:(id)sender
222 {
223     // FIXME: non-text zoom not implemented.
224     _zoomTextOnly = !_zoomTextOnly;
225 }
226
227 - (IBAction)find:(id)sender
228 {
229 }
230
231 - (IBAction)dumpSourceToConsole:(id)sender
232 {
233 }
234
235 - (void)didChangeSettings
236 {
237     SettingsController *settings = [SettingsController shared];
238
239     [[WebPreferences standardPreferences] setSubpixelCSSOMElementMetricsEnabled:settings.subPixelCSSOMMetricsEnabled];
240     [[WebPreferences standardPreferences] setShowDebugBorders:settings.layerBordersVisible];
241     [[WebPreferences standardPreferences] setSimpleLineLayoutDebugBordersEnabled:settings.simpleLineLayoutDebugBordersEnabled];
242     [[WebPreferences standardPreferences] setShowRepaintCounter:settings.layerBordersVisible];
243
244     BOOL useTransparentWindows = settings.useTransparentWindows;
245     if (useTransparentWindows != !self.window.isOpaque) {
246         [self.window setOpaque:!useTransparentWindows];
247         [self.window setHasShadow:!useTransparentWindows];
248
249         [_webView setBackgroundColor:useTransparentWindows ? [NSColor clearColor] : [NSColor whiteColor]];
250
251         [self.window display];
252     }
253
254     BOOL usePaginatedMode = settings.usePaginatedMode;
255     if (usePaginatedMode != (_webView._paginationMode != WebPaginationModeUnpaginated)) {
256         if (usePaginatedMode) {
257             [_webView _setPaginationMode:WebPaginationModeLeftToRight];
258             [_webView _setPageLength:_webView.bounds.size.width / 2];
259             [_webView _setGapBetweenPages:10];
260         } else
261             [_webView _setPaginationMode:WebPaginationModeUnpaginated];
262     }
263 }
264
265 - (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener
266 {
267     [listener use];
268 }
269
270 // WebFrameLoadDelegate Methods
271 - (void)webView:(WebView *)sender didStartProvisionalLoadForFrame:(WebFrame *)frame
272 {
273 }
274
275 - (void)webView:(WebView *)sender didCommitLoadForFrame:(WebFrame *)frame
276 {
277     if (frame != [sender mainFrame])
278         return;
279
280     NSURL *committedURL = [[[frame dataSource] request] URL];
281     [urlText setStringValue:[committedURL absoluteString]];
282 }
283
284 - (void)webView:(WebView *)sender didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame
285 {
286     if (frame != [sender mainFrame])
287         return;
288
289     [self.window setTitle:[title stringByAppendingString:@" [WK1]"]];
290 }
291
292 - (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame
293 {
294     NSAlert *alert = [[NSAlert alloc] init];
295     [alert addButtonWithTitle:@"OK"];
296
297     alert.messageText = [NSString stringWithFormat:@"JavaScript alert dialog from %@.", frame.dataSource.request.URL.absoluteString];
298     alert.informativeText = message;
299
300     [alert runModal];
301     [alert release];
302 }
303
304 @end