[WK2] Expose a few drawing/compositing settings on WKPreferences(Private)
[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 (action == @selector(togglePaginationMode:))
134         [menuItem setState:[self isPaginated] ? NSOnState : NSOffState];
135     else if (action == @selector(toggleTransparentWindow:))
136         [menuItem setState:[[self window] isOpaque] ? NSOffState : NSOnState];
137     else if (action == @selector(toggleSubpixelCSSOMElementMetricsEnabled:))
138         [menuItem setState:[self isSubpixelCSSOMElementMetricsEnabled] ? NSOnState : NSOffState];
139     else if (action == @selector(toggleLayerBordersVisibility:))
140         [menuItem setState:[self layerBordersVisible] ? NSOnState : NSOffState];
141
142     return YES;
143 }
144
145 - (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item
146 {
147     SEL action = [item action];
148
149     if (action == @selector(goBack:))
150         return [_webView canGoBack];
151     
152     if (action == @selector(goForward:))
153         return [_webView canGoForward];
154     
155     return YES;
156 }
157
158 - (void)validateToolbar
159 {
160     [toolbar validateVisibleItems];
161 }
162
163 - (BOOL)windowShouldClose:(id)sender
164 {
165     return YES;
166 }
167
168 - (void)windowWillClose:(NSNotification *)notification
169 {
170     [(BrowserAppDelegate *)[NSApp delegate] browserWindowWillClose:[self window]];
171     [self autorelease];
172 }
173
174 - (void)applicationTerminating
175 {
176 }
177
178 - (double)currentZoomFactor
179 {
180     return 1;
181 }
182
183 - (BOOL)canZoomIn
184 {
185     return [_webView canMakeTextLarger];
186 }
187
188 - (void)zoomIn:(id)sender
189 {
190     if (![self canZoomIn])
191         return;
192
193     [_webView makeTextLarger:sender];
194 }
195
196 - (BOOL)canZoomOut
197 {
198     return [_webView canMakeTextSmaller];
199 }
200
201 - (void)zoomOut:(id)sender
202 {
203     if (![self canZoomIn])
204         return;
205
206     [_webView makeTextSmaller:sender];
207 }
208
209 - (BOOL)canResetZoom
210 {
211     return [_webView canMakeTextStandardSize];
212 }
213
214 - (void)resetZoom:(id)sender
215 {
216     if (![self canResetZoom])
217         return;
218
219     [_webView makeTextStandardSize:sender];
220 }
221
222 - (IBAction)toggleZoomMode:(id)sender
223 {
224     // FIXME: non-text zoom not implemented.
225     _zoomTextOnly = !_zoomTextOnly;
226 }
227
228 - (BOOL)isPaginated
229 {
230     return [_webView _paginationMode] != WebPaginationModeUnpaginated;
231 }
232
233 - (IBAction)togglePaginationMode:(id)sender
234 {
235     if ([self isPaginated]) {
236         [_webView _setPaginationMode:WebPaginationModeUnpaginated];
237     } else {
238         [_webView _setPaginationMode:WebPaginationModeRightToLeft];
239         [_webView _setPageLength:_webView.bounds.size.width / 2];
240         [_webView _setGapBetweenPages:10];
241     }
242 }
243
244 - (IBAction)toggleTransparentWindow:(id)sender
245 {
246     BOOL isTransparent = ![[self window] isOpaque];
247     isTransparent = !isTransparent;
248     
249     [[self window] setOpaque:!isTransparent];
250     [[self window] setHasShadow:!isTransparent];
251
252     if (isTransparent)
253         [_webView setBackgroundColor:[NSColor clearColor]];
254     else
255         [_webView setBackgroundColor:[NSColor whiteColor]];
256
257     [[self window] display];
258 }
259
260 - (BOOL)isSubpixelCSSOMElementMetricsEnabled
261 {
262     return [[WebPreferences standardPreferences] subpixelCSSOMElementMetricsEnabled];
263 }
264
265 - (IBAction)toggleSubpixelCSSOMElementMetricsEnabled:(id)sender
266 {
267     [[WebPreferences standardPreferences] setSubpixelCSSOMElementMetricsEnabled:![self isSubpixelCSSOMElementMetricsEnabled]];
268 }
269
270 - (BOOL)layerBordersVisible
271 {
272     return [[WebPreferences standardPreferences] showDebugBorders];
273 }
274
275 - (IBAction)toggleLayerBordersVisibility:(id)sender
276 {
277     BOOL newValue = ![self layerBordersVisible];
278     [[WebPreferences standardPreferences] setShowDebugBorders:newValue];
279     [[WebPreferences standardPreferences] setShowRepaintCounter:newValue];
280 }
281
282 - (IBAction)find:(id)sender
283 {
284 }
285
286 - (IBAction)dumpSourceToConsole:(id)sender
287 {
288 }
289
290 - (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener
291 {
292     [listener use];
293 }
294
295 // WebFrameLoadDelegate Methods
296 - (void)webView:(WebView *)sender didStartProvisionalLoadForFrame:(WebFrame *)frame
297 {
298 }
299
300 - (void)webView:(WebView *)sender didCommitLoadForFrame:(WebFrame *)frame
301 {
302     if (frame != [sender mainFrame])
303         return;
304
305     NSURL *committedURL = [[[frame dataSource] request] URL];
306     [urlText setStringValue:[committedURL absoluteString]];
307 }
308
309 - (void)webView:(WebView *)sender didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame
310 {
311     if (frame != [sender mainFrame])
312         return;
313
314     [[self window] setTitle:[title stringByAppendingString:@" [WK1]"]];
315 }
316
317 - (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame
318 {
319     NSAlert *alert = [[NSAlert alloc] init];
320     [alert addButtonWithTitle:@"OK"];
321
322     alert.messageText = [NSString stringWithFormat:@"JavaScript alert dialog from %@.", frame.dataSource.request.URL.absoluteString];
323     alert.informativeText = message;
324
325     [alert runModal];
326     [alert release];
327 }
328
329 @end