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