d05ee95c3ebbcadfc4805d77ca8d3a695b4da0e2
[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)setScale:(id)sender
104 {
105     
106 }
107
108 - (IBAction)reload:(id)sender
109 {
110     [_webView reload:sender];
111 }
112
113 - (IBAction)forceRepaint:(id)sender
114 {
115     [_webView setNeedsDisplay:YES];
116 }
117
118 - (IBAction)goBack:(id)sender
119 {
120     [_webView goBack:sender];
121 }
122
123 - (IBAction)goForward:(id)sender
124 {
125     [_webView goForward:sender];
126 }
127
128 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
129 {
130     SEL action = [menuItem action];
131
132     if (action == @selector(zoomIn:))
133         return [self canZoomIn];
134     if (action == @selector(zoomOut:))
135         return [self canZoomOut];
136     if (action == @selector(resetZoom:))
137         return [self canResetZoom];
138
139     if (action == @selector(showHideWebView:))
140         [menuItem setTitle:[_webView isHidden] ? @"Show Web View" : @"Hide Web View"];
141     else if (action == @selector(removeReinsertWebView:))
142         [menuItem setTitle:[_webView window] ? @"Remove Web View" : @"Insert Web View"];
143     else if (action == @selector(toggleZoomMode:))
144         [menuItem setState:_zoomTextOnly ? NSOnState : NSOffState];
145
146     return YES;
147 }
148
149 - (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item
150 {
151     SEL action = [item action];
152
153     if (action == @selector(goBack:))
154         return [_webView canGoBack];
155     
156     if (action == @selector(goForward:))
157         return [_webView canGoForward];
158     
159     return YES;
160 }
161
162 - (void)validateToolbar
163 {
164     [toolbar validateVisibleItems];
165 }
166
167 - (BOOL)windowShouldClose:(id)sender
168 {
169     return YES;
170 }
171
172 - (void)windowWillClose:(NSNotification *)notification
173 {
174     [(BrowserAppDelegate *)[[NSApplication sharedApplication] delegate] browserWindowWillClose:self.window];
175     [self autorelease];
176 }
177
178 - (void)applicationTerminating
179 {
180 }
181
182 - (double)currentZoomFactor
183 {
184     return 1;
185 }
186
187 - (BOOL)canZoomIn
188 {
189     return [_webView canMakeTextLarger];
190 }
191
192 - (void)zoomIn:(id)sender
193 {
194     if (![self canZoomIn])
195         return;
196
197     [_webView makeTextLarger:sender];
198 }
199
200 - (BOOL)canZoomOut
201 {
202     return [_webView canMakeTextSmaller];
203 }
204
205 - (void)zoomOut:(id)sender
206 {
207     if (![self canZoomIn])
208         return;
209
210     [_webView makeTextSmaller:sender];
211 }
212
213 - (BOOL)canResetZoom
214 {
215     return [_webView canMakeTextStandardSize];
216 }
217
218 - (void)resetZoom:(id)sender
219 {
220     if (![self canResetZoom])
221         return;
222
223     [_webView makeTextStandardSize:sender];
224 }
225
226 - (IBAction)toggleZoomMode:(id)sender
227 {
228     // FIXME: non-text zoom not implemented.
229     _zoomTextOnly = !_zoomTextOnly;
230 }
231
232 - (IBAction)toggleUseMinimumViewSize:(id)sender
233 {
234
235 }
236
237 - (IBAction)find:(id)sender
238 {
239 }
240
241 - (IBAction)dumpSourceToConsole:(id)sender
242 {
243 }
244
245 - (void)didChangeSettings
246 {
247     SettingsController *settings = [SettingsController shared];
248
249     [[WebPreferences standardPreferences] setSubpixelCSSOMElementMetricsEnabled:settings.subPixelCSSOMMetricsEnabled];
250     [[WebPreferences standardPreferences] setShowDebugBorders:settings.layerBordersVisible];
251     [[WebPreferences standardPreferences] setSimpleLineLayoutDebugBordersEnabled:settings.simpleLineLayoutDebugBordersEnabled];
252     [[WebPreferences standardPreferences] setShowRepaintCounter:settings.layerBordersVisible];
253
254     BOOL useTransparentWindows = settings.useTransparentWindows;
255     if (useTransparentWindows != !self.window.isOpaque) {
256         [self.window setOpaque:!useTransparentWindows];
257         [self.window setHasShadow:!useTransparentWindows];
258
259         [_webView setBackgroundColor:useTransparentWindows ? [NSColor clearColor] : [NSColor whiteColor]];
260
261         [self.window display];
262     }
263
264     BOOL usePaginatedMode = settings.usePaginatedMode;
265     if (usePaginatedMode != (_webView._paginationMode != WebPaginationModeUnpaginated)) {
266         if (usePaginatedMode) {
267             [_webView _setPaginationMode:WebPaginationModeLeftToRight];
268             [_webView _setPageLength:_webView.bounds.size.width / 2];
269             [_webView _setGapBetweenPages:10];
270         } else
271             [_webView _setPaginationMode:WebPaginationModeUnpaginated];
272     }
273 }
274
275 - (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener
276 {
277     [listener use];
278 }
279
280 // WebFrameLoadDelegate Methods
281 - (void)webView:(WebView *)sender didStartProvisionalLoadForFrame:(WebFrame *)frame
282 {
283 }
284
285 - (void)webView:(WebView *)sender didCommitLoadForFrame:(WebFrame *)frame
286 {
287     if (frame != [sender mainFrame])
288         return;
289
290     NSURL *committedURL = [[[frame dataSource] request] URL];
291     [urlText setStringValue:[committedURL absoluteString]];
292 }
293
294 - (void)webView:(WebView *)sender didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame
295 {
296     if (frame != [sender mainFrame])
297         return;
298
299     [self.window setTitle:[title stringByAppendingString:@" [WK1]"]];
300 }
301
302 - (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame
303 {
304     NSAlert *alert = [[NSAlert alloc] init];
305     [alert addButtonWithTitle:@"OK"];
306
307     alert.messageText = [NSString stringWithFormat:@"JavaScript alert dialog from %@.", frame.dataSource.request.URL.absoluteString];
308     alert.informativeText = message;
309
310     [alert runModal];
311     [alert release];
312 }
313
314 @end