1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2010 Apple Inc. All rights reserved.
3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Redistribution and use in source and binary forms, with or without
5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * modification, are permitted provided that the following conditions
6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * are met:
7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 1. Redistributions of source code must retain the above copyright
8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *    notice, this list of conditions and the following disclaimer.
9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 2. Redistributions in binary form must reproduce the above copyright
10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *    notice, this list of conditions and the following disclaimer in the
11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *    documentation and/or other materials provided with the distribution.
12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THE POSSIBILITY OF SUCH DAMAGE.
24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import "BrowserWindowController.h"
27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#import <WebKit2/WKPagePrivate.h>
29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <WebKit2/WKStringCF.h>
30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <WebKit2/WKURLCF.h>
31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block@interface BrowserWindowController ()
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)didStartProgress;
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)didChangeProgress:(double)value;
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)didFinishProgress;
36967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)didStartProvisionalLoadForFrame:(WKFrameRef)frame;
37967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)didCommitLoadForFrame:(WKFrameRef)frame;
38967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)didReceiveServerRedirectForProvisionalLoadForFrame:(WKFrameRef)frame;
39967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)didFailProvisionalLoadWithErrorForFrame:(WKFrameRef)frame;
40967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)didFailLoadWithErrorForFrame:(WKFrameRef)frame;
41f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch- (void)didSameDocumentNavigationForFrame:(WKFrameRef)frame;
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block@end
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block@implementation BrowserWindowController
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
46f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch- (id)initWithContext:(WKContextRef)context
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
4868513a70bcd92384395513322f1b801e7bf9c729Steve Block    if ((self = [super initWithWindowNibName:@"BrowserWindow"])) {
49f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        _context = WKRetain(context);
5068513a70bcd92384395513322f1b801e7bf9c729Steve Block        _zoomTextOnly = NO;
5168513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return self;
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)dealloc
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
58f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    assert(!_context);
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [super dealloc];
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (IBAction)fetch:(id)sender
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CFURLRef cfURL = CFURLCreateWithString(0, (CFStringRef)[urlText stringValue], 0);
6568513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!cfURL)
6668513a70bcd92384395513322f1b801e7bf9c729Steve Block        return;
6768513a70bcd92384395513322f1b801e7bf9c729Steve Block
68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WKURLRef url = WKURLCreateWithCFURL(cfURL);
69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CFRelease(cfURL);
70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WKPageLoadURL(_webView.pageRef, url);
72e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    WKRelease(url);
73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (IBAction)showHideWebView:(id)sender
76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    BOOL hidden = ![_webView isHidden];
78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [_webView setHidden:hidden];
80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (IBAction)removeReinsertWebView:(id)sender
83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if ([_webView window]) {
85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        [_webView retain];
86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        [_webView removeFromSuperview];
87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        [containerView addSubview:_webView];
89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        [_webView release];
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
9568513a70bcd92384395513322f1b801e7bf9c729Steve Block    SEL action = [menuItem action];
9668513a70bcd92384395513322f1b801e7bf9c729Steve Block
9768513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (action == @selector(zoomIn:))
9868513a70bcd92384395513322f1b801e7bf9c729Steve Block        return [self canZoomIn];
9968513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (action == @selector(zoomOut:))
10068513a70bcd92384395513322f1b801e7bf9c729Steve Block        return [self canZoomOut];
10168513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (action == @selector(resetZoom:))
10268513a70bcd92384395513322f1b801e7bf9c729Steve Block        return [self canResetZoom];
10368513a70bcd92384395513322f1b801e7bf9c729Steve Block
10468513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (action == @selector(showHideWebView:))
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        [menuItem setTitle:[_webView isHidden] ? @"Show Web View" : @"Hide Web View"];
10668513a70bcd92384395513322f1b801e7bf9c729Steve Block    else if (action == @selector(removeReinsertWebView:))
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        [menuItem setTitle:[_webView window] ? @"Remove Web View" : @"Insert Web View"];
10868513a70bcd92384395513322f1b801e7bf9c729Steve Block    else if (action == @selector(toggleZoomMode:))
10968513a70bcd92384395513322f1b801e7bf9c729Steve Block        [menuItem setState:_zoomTextOnly ? NSOnState : NSOffState];
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return YES;
111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (IBAction)reload:(id)sender
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WKPageReload(_webView.pageRef);
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (IBAction)forceRepaint:(id)sender
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [_webView setNeedsDisplay:YES];
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
123967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (IBAction)goBack:(id)sender
124967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
125967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    WKPageGoBack(_webView.pageRef);
126967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
127967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
128967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (IBAction)goForward:(id)sender
129967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
130967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    WKPageGoForward(_webView.pageRef);
131967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
132967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
133967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item
134967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
135967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SEL action = [item action];
13668513a70bcd92384395513322f1b801e7bf9c729Steve Block
137967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (action == @selector(goBack:))
138967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return _webView && WKPageCanGoBack(_webView.pageRef);
139967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
140967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (action == @selector(goForward:))
141967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return _webView && WKPageCanGoForward(_webView.pageRef);
142967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
143967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return YES;
144967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
145967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
146967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)validateToolbar
147967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
148967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    [toolbar validateVisibleItems];
149967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
150967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (BOOL)windowShouldClose:(id)sender
152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
15306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    LOG(@"windowShouldClose");
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    BOOL canCloseImmediately = WKPageTryClose(_webView.pageRef);
155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return canCloseImmediately;
156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)windowWillClose:(NSNotification *)notification
159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
160f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    WKRelease(_context);
161f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _context = 0;
162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)applicationTerminating
165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WKPageClose(_webView.pageRef);
167e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    WKRelease(_webView.pageRef);
168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
17068513a70bcd92384395513322f1b801e7bf9c729Steve Block#define DefaultMinimumZoomFactor (.5)
17168513a70bcd92384395513322f1b801e7bf9c729Steve Block#define DefaultMaximumZoomFactor (3.0)
17268513a70bcd92384395513322f1b801e7bf9c729Steve Block#define DefaultZoomFactorRatio (1.2)
17368513a70bcd92384395513322f1b801e7bf9c729Steve Block
17468513a70bcd92384395513322f1b801e7bf9c729Steve Block- (double)currentZoomFactor
17568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
17668513a70bcd92384395513322f1b801e7bf9c729Steve Block    return _zoomTextOnly ? WKPageGetTextZoomFactor(_webView.pageRef) : WKPageGetPageZoomFactor(_webView.pageRef);
17768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
17868513a70bcd92384395513322f1b801e7bf9c729Steve Block
17968513a70bcd92384395513322f1b801e7bf9c729Steve Block- (void)setCurrentZoomFactor:(double)factor
18068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
18168513a70bcd92384395513322f1b801e7bf9c729Steve Block    _zoomTextOnly ? WKPageSetTextZoomFactor(_webView.pageRef, factor) : WKPageSetPageZoomFactor(_webView.pageRef, factor);
18268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
18368513a70bcd92384395513322f1b801e7bf9c729Steve Block
18468513a70bcd92384395513322f1b801e7bf9c729Steve Block- (BOOL)canZoomIn
18568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
18668513a70bcd92384395513322f1b801e7bf9c729Steve Block    return [self currentZoomFactor] * DefaultZoomFactorRatio < DefaultMaximumZoomFactor;
18768513a70bcd92384395513322f1b801e7bf9c729Steve Block}
18868513a70bcd92384395513322f1b801e7bf9c729Steve Block
18968513a70bcd92384395513322f1b801e7bf9c729Steve Block- (void)zoomIn:(id)sender
19068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
19168513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (![self canZoomIn])
19268513a70bcd92384395513322f1b801e7bf9c729Steve Block        return;
19368513a70bcd92384395513322f1b801e7bf9c729Steve Block
19468513a70bcd92384395513322f1b801e7bf9c729Steve Block    double factor = [self currentZoomFactor] * DefaultZoomFactorRatio;
19568513a70bcd92384395513322f1b801e7bf9c729Steve Block    [self setCurrentZoomFactor:factor];
19668513a70bcd92384395513322f1b801e7bf9c729Steve Block}
19768513a70bcd92384395513322f1b801e7bf9c729Steve Block
19868513a70bcd92384395513322f1b801e7bf9c729Steve Block- (BOOL)canZoomOut
19968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
20068513a70bcd92384395513322f1b801e7bf9c729Steve Block    return [self currentZoomFactor] / DefaultZoomFactorRatio > DefaultMinimumZoomFactor;
20168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
20268513a70bcd92384395513322f1b801e7bf9c729Steve Block
20368513a70bcd92384395513322f1b801e7bf9c729Steve Block- (void)zoomOut:(id)sender
20468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
20568513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (![self canZoomIn])
20668513a70bcd92384395513322f1b801e7bf9c729Steve Block        return;
20768513a70bcd92384395513322f1b801e7bf9c729Steve Block
20868513a70bcd92384395513322f1b801e7bf9c729Steve Block    double factor = [self currentZoomFactor] / DefaultZoomFactorRatio;
20968513a70bcd92384395513322f1b801e7bf9c729Steve Block    [self setCurrentZoomFactor:factor];
21068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
21168513a70bcd92384395513322f1b801e7bf9c729Steve Block
21268513a70bcd92384395513322f1b801e7bf9c729Steve Block- (BOOL)canResetZoom
21368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
21468513a70bcd92384395513322f1b801e7bf9c729Steve Block    return _zoomTextOnly ? (WKPageGetTextZoomFactor(_webView.pageRef) != 1) : (WKPageGetPageZoomFactor(_webView.pageRef) != 1);
21568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
21668513a70bcd92384395513322f1b801e7bf9c729Steve Block
21768513a70bcd92384395513322f1b801e7bf9c729Steve Block- (void)resetZoom:(id)sender
21868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
21968513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (![self canResetZoom])
22068513a70bcd92384395513322f1b801e7bf9c729Steve Block        return;
22168513a70bcd92384395513322f1b801e7bf9c729Steve Block
22268513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (_zoomTextOnly)
22368513a70bcd92384395513322f1b801e7bf9c729Steve Block        WKPageSetTextZoomFactor(_webView.pageRef, 1);
22468513a70bcd92384395513322f1b801e7bf9c729Steve Block    else
22568513a70bcd92384395513322f1b801e7bf9c729Steve Block        WKPageSetPageZoomFactor(_webView.pageRef, 1);
22668513a70bcd92384395513322f1b801e7bf9c729Steve Block}
22768513a70bcd92384395513322f1b801e7bf9c729Steve Block
22868513a70bcd92384395513322f1b801e7bf9c729Steve Block- (IBAction)toggleZoomMode:(id)sender
22968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
23068513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (_zoomTextOnly) {
23168513a70bcd92384395513322f1b801e7bf9c729Steve Block        _zoomTextOnly = NO;
23268513a70bcd92384395513322f1b801e7bf9c729Steve Block        double currentTextZoom = WKPageGetTextZoomFactor(_webView.pageRef);
23368513a70bcd92384395513322f1b801e7bf9c729Steve Block        WKPageSetPageAndTextZoomFactors(_webView.pageRef, currentTextZoom, 1);
23468513a70bcd92384395513322f1b801e7bf9c729Steve Block    } else {
23568513a70bcd92384395513322f1b801e7bf9c729Steve Block        _zoomTextOnly = YES;
23668513a70bcd92384395513322f1b801e7bf9c729Steve Block        double currentPageZoom = WKPageGetPageZoomFactor(_webView.pageRef);
23768513a70bcd92384395513322f1b801e7bf9c729Steve Block        WKPageSetPageAndTextZoomFactors(_webView.pageRef, 1, currentPageZoom);
23868513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
23968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
24068513a70bcd92384395513322f1b801e7bf9c729Steve Block
24168513a70bcd92384395513322f1b801e7bf9c729Steve Block- (IBAction)dumpSourceToConsole:(id)sender
24268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
24368513a70bcd92384395513322f1b801e7bf9c729Steve Block    WKPageGetSourceForFrame_b(_webView.pageRef, WKPageGetMainFrame(_webView.pageRef), ^(WKStringRef result, WKErrorRef error) {
24468513a70bcd92384395513322f1b801e7bf9c729Steve Block        CFStringRef cfResult = WKStringCopyCFString(0, result);
24568513a70bcd92384395513322f1b801e7bf9c729Steve Block        LOG(@"Main frame source\n \"%@\"", (NSString *)cfResult);
24668513a70bcd92384395513322f1b801e7bf9c729Steve Block        CFRelease(cfResult);
24768513a70bcd92384395513322f1b801e7bf9c729Steve Block    });
24868513a70bcd92384395513322f1b801e7bf9c729Steve Block}
24968513a70bcd92384395513322f1b801e7bf9c729Steve Block
250cad810f21b803229eb11403f9209855525a25d57Steve Block// MARK: Loader Client Callbacks
251dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
25268513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic void didStartProvisionalLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
254967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    [(BrowserWindowController *)clientInfo didStartProvisionalLoadForFrame:frame];
255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
25768513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic void didReceiveServerRedirectForProvisionalLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
259967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    [(BrowserWindowController *)clientInfo didReceiveServerRedirectForProvisionalLoadForFrame:frame];
260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
261dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
262a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic void didFailProvisionalLoadWithErrorForFrame(WKPageRef page, WKFrameRef frame, WKErrorRef error, WKTypeRef userData, const void *clientInfo)
263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
264967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    [(BrowserWindowController *)clientInfo didFailProvisionalLoadWithErrorForFrame:frame];
265dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
26768513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic void didCommitLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
269967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    [(BrowserWindowController *)clientInfo didCommitLoadForFrame:frame];
270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
27268513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic void didFinishDocumentLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
2735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
2745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    LOG(@"didFinishDocumentLoadForFrame");
2755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
2765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
27768513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
27906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    LOG(@"didFinishLoadForFrame");
280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
281dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
282a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic void didFailLoadWithErrorForFrame(WKPageRef page, WKFrameRef frame, WKErrorRef error, WKTypeRef userData, const void *clientInfo)
283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
284967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    [(BrowserWindowController *)clientInfo didFailLoadWithErrorForFrame:frame];
285dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
286dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
287f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic void didSameDocumentNavigationForFrame(WKPageRef page, WKFrameRef frame, WKSameDocumentNavigationType type, WKTypeRef userData, const void *clientInfo)
288f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
289f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [(BrowserWindowController *)clientInfo didSameDocumentNavigationForFrame:frame];
290f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
291f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
29268513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic void didReceiveTitleForFrame(WKPageRef page, WKStringRef title, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CFStringRef cfTitle = WKStringCopyCFString(0, title);
29506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    LOG(@"didReceiveTitleForFrame \"%@\"", (NSString *)cfTitle);
296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CFRelease(cfTitle);
297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
298dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
29968513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic void didFirstLayoutForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
300dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
30106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    LOG(@"didFirstLayoutForFrame");
302dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
303dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
30468513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic void didFirstVisuallyNonEmptyLayoutForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
30606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    LOG(@"didFirstVisuallyNonEmptyLayoutForFrame");
307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
308dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
309bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenstatic void didRemoveFrameFromHierarchy(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
310bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
311bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    LOG(@"didRemoveFrameFromHierarchy");
312bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
313bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
314e14391e94c850b8bd03680c23b38978db68687a8John Reckstatic void didDisplayInsecureContentForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
315e14391e94c850b8bd03680c23b38978db68687a8John Reck{
316e14391e94c850b8bd03680c23b38978db68687a8John Reck    LOG(@"didDisplayInsecureContentForFrame");
317e14391e94c850b8bd03680c23b38978db68687a8John Reck}
318e14391e94c850b8bd03680c23b38978db68687a8John Reck
319e14391e94c850b8bd03680c23b38978db68687a8John Reckstatic void didRunInsecureContentForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
320e14391e94c850b8bd03680c23b38978db68687a8John Reck{
321e14391e94c850b8bd03680c23b38978db68687a8John Reck    LOG(@"didRunInsecureContentForFrame");
322e14391e94c850b8bd03680c23b38978db68687a8John Reck}
323e14391e94c850b8bd03680c23b38978db68687a8John Reck
3240617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic void didStartProgress(WKPageRef page, const void *clientInfo)
325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [(BrowserWindowController *)clientInfo didStartProgress];
327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3290617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic void didChangeProgress(WKPageRef page, const void *clientInfo)
330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
33106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    [(BrowserWindowController *)clientInfo didChangeProgress:WKPageGetEstimatedProgress(page)];
332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3340617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic void didFinishProgress(WKPageRef page, const void *clientInfo)
335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [(BrowserWindowController *)clientInfo didFinishProgress];
337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3390617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic void didBecomeUnresponsive(WKPageRef page, const void *clientInfo)
340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
34106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    LOG(@"didBecomeUnresponsive");
342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3440617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic void didBecomeResponsive(WKPageRef page, const void *clientInfo)
345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
34606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    LOG(@"didBecomeResponsive");
347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3490617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic void processDidExit(WKPageRef page, const void *clientInfo)
3500617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
3510617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    LOG(@"processDidExit");
3520617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
3530617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
3542fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic void didChangeBackForwardList(WKPageRef page, WKBackForwardListItemRef addedItem, WKArrayRef removedItems, const void *clientInfo)
355967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
356967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    [(BrowserWindowController *)clientInfo validateToolbar];
357967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
358967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
359cad810f21b803229eb11403f9209855525a25d57Steve Block// MARK: Policy Client Callbacks
360dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3612fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic void decidePolicyForNavigationAction(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
36306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    LOG(@"decidePolicyForNavigationAction");
364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WKFramePolicyListenerUse(listener);
365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3672fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic void decidePolicyForNewWindowAction(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRequestRef request, WKStringRef frameName, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
36906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    LOG(@"decidePolicyForNewWindowAction");
370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WKFramePolicyListenerUse(listener);
371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
372dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
37381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic void decidePolicyForResponse(WKPageRef page, WKFrameRef frame, WKURLResponseRef response, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WKFramePolicyListenerUse(listener);
376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
378cad810f21b803229eb11403f9209855525a25d57Steve Block// MARK: UI Client Callbacks
379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
380e14391e94c850b8bd03680c23b38978db68687a8John Reckstatic WKPageRef createNewPage(WKPageRef page, WKDictionaryRef features, WKEventModifiers modifiers, WKEventMouseButton button, const void* clientInfo)
381dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
38206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    LOG(@"createNewPage");
383f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    BrowserWindowController *controller = [[BrowserWindowController alloc] initWithContext:WKPageGetContext(page)];
384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [controller loadWindow];
385dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
386dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return controller->_webView.pageRef;
387dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
388dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3890617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic void showPage(WKPageRef page, const void *clientInfo)
390dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
39106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    LOG(@"showPage");
392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [[(BrowserWindowController *)clientInfo window] orderFront:nil];
393dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
394dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3950617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic void closePage(WKPageRef page, const void *clientInfo)
396dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
39706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    LOG(@"closePage");
398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WKPageClose(page);
399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [[(BrowserWindowController *)clientInfo window] close];
400e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    WKRelease(page);
401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4030617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic void runJavaScriptAlert(WKPageRef page, WKStringRef message, WKFrameRef frame, const void* clientInfo)
404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    NSAlert* alert = [[NSAlert alloc] init];
406dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4070617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    WKURLRef wkURL = WKFrameCopyURL(frame);
4080617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
409e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    WKRelease(wkURL);
4100617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4110617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    [alert setMessageText:[NSString stringWithFormat:@"JavaScript alert dialog from %@.", [(NSURL *)cfURL absoluteString]]];
412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CFRelease(cfURL);
413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4140617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    CFStringRef cfMessage = WKStringCopyCFString(0, message);
4150617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    [alert setInformativeText:(NSString *)cfMessage];
4160617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    CFRelease(cfMessage);
417dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [alert addButtonWithTitle:@"OK"];
419dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
420dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [alert runModal];
421dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [alert release];
422dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
423dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4240617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic bool runJavaScriptConfirm(WKPageRef page, WKStringRef message, WKFrameRef frame, const void* clientInfo)
4250617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
4260617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    NSAlert* alert = [[NSAlert alloc] init];
427dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4280617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    WKURLRef wkURL = WKFrameCopyURL(frame);
4290617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
430e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    WKRelease(wkURL);
431dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4320617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    [alert setMessageText:[NSString stringWithFormat:@"JavaScript confirm dialog from %@.", [(NSURL *)cfURL absoluteString]]];
4330617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    CFRelease(cfURL);
434dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4350617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    CFStringRef cfMessage = WKStringCopyCFString(0, message);
4360617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    [alert setInformativeText:(NSString *)cfMessage];
4370617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    CFRelease(cfMessage);
438dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4390617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    [alert addButtonWithTitle:@"OK"];
4400617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    [alert addButtonWithTitle:@"Cancel"];
4410617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4420617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    NSInteger button = [alert runModal];
4430617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    [alert release];
4440617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4450617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return button == NSAlertFirstButtonReturn;
446dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
447dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4480617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic WKStringRef runJavaScriptPrompt(WKPageRef page, WKStringRef message, WKStringRef defaultValue, WKFrameRef frame, const void* clientInfo)
449dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
4500617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    NSAlert* alert = [[NSAlert alloc] init];
4510617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4520617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    WKURLRef wkURL = WKFrameCopyURL(frame);
4530617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
454e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    WKRelease(wkURL);
4550617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4560617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    [alert setMessageText:[NSString stringWithFormat:@"JavaScript prompt dialog from %@.", [(NSURL *)cfURL absoluteString]]];
457dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CFRelease(cfURL);
4580617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4590617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    CFStringRef cfMessage = WKStringCopyCFString(0, message);
4600617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    [alert setInformativeText:(NSString *)cfMessage];
4610617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    CFRelease(cfMessage);
4620617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4630617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    [alert addButtonWithTitle:@"OK"];
4640617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    [alert addButtonWithTitle:@"Cancel"];
4650617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4660617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    NSTextField* input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 24)];
4670617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    CFStringRef cfDefaultValue = WKStringCopyCFString(0, defaultValue);
4680617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    [input setStringValue:(NSString *)cfDefaultValue];
4690617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    CFRelease(cfDefaultValue);
4700617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4710617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    [alert setAccessoryView:input];
4720617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4730617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    NSInteger button = [alert runModal];
4740617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4750617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    NSString* result = nil;
4760617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (button == NSAlertFirstButtonReturn) {
4770617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        [input validateEditing];
4780617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        result = [input stringValue];
4790617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    }
4800617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4810617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    [alert release];
4820617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4830617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!result)
4840617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return 0;
4850617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return WKStringCreateWithCFString((CFStringRef)result);
486dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
487dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
48868513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic void setStatusText(WKPageRef page, WKStringRef text, const void* clientInfo)
48968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
49068513a70bcd92384395513322f1b801e7bf9c729Steve Block    LOG(@"setStatusText");
49168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
49268513a70bcd92384395513322f1b801e7bf9c729Steve Block
493bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenstatic void mouseDidMoveOverElement(WKPageRef page, WKEventModifiers modifiers, WKTypeRef userData, const void *clientInfo)
494bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
495bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    LOG(@"mouseDidMoveOverElement");
496bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
497bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
498a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic WKRect getWindowFrame(WKPageRef page, const void* clientInfo)
499a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
500a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    NSRect rect = [[(BrowserWindowController *)clientInfo window] frame];
501a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    WKRect wkRect;
502a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    wkRect.origin.x = rect.origin.x;
503a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    wkRect.origin.y = rect.origin.y;
504a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    wkRect.size.width = rect.size.width;
505a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    wkRect.size.height = rect.size.height;
506a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return wkRect;
507a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
508a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
509a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic void setWindowFrame(WKPageRef page, WKRect rect, const void* clientInfo)
510a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
511a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    [[(BrowserWindowController *)clientInfo window] setFrame:NSMakeRect(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height) display:YES];
512a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
513a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
514a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic bool runBeforeUnloadConfirmPanel(WKPageRef page, WKStringRef message, WKFrameRef frame, const void* clientInfo)
515a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
516a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    NSAlert *alert = [[NSAlert alloc] init];
517a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
518a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    WKURLRef wkURL = WKFrameCopyURL(frame);
519a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
520a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    WKRelease(wkURL);
521a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
522a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    [alert setMessageText:[NSString stringWithFormat:@"BeforeUnload confirm dialog from %@.", [(NSURL *)cfURL absoluteString]]];
523a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    CFRelease(cfURL);
524a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
525a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    CFStringRef cfMessage = WKStringCopyCFString(0, message);
526a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    [alert setInformativeText:(NSString *)cfMessage];
527a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    CFRelease(cfMessage);
528a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
529a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    [alert addButtonWithTitle:@"OK"];
530a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    [alert addButtonWithTitle:@"Cancel"];
531a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
532a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    NSInteger button = [alert runModal];
533a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    [alert release];
534a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
535a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return button == NSAlertFirstButtonReturn;
536a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
537a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
538f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic void runOpenPanel(WKPageRef page, WKFrameRef frame, WKOpenPanelParametersRef parameters, WKOpenPanelResultListenerRef listener, const void* clientInfo)
539f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
540f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSOpenPanel *openPanel = [NSOpenPanel openPanel];
541f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [openPanel setAllowsMultipleSelection:WKOpenPanelParametersGetAllowsMultipleFiles(parameters)];
542f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
543f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    WKRetain(listener);
544f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
545f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [openPanel beginSheetModalForWindow:[(BrowserWindowController *)clientInfo window] completionHandler:^(NSInteger result) {
546f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (result == NSFileHandlingPanelOKButton) {
547f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            WKMutableArrayRef fileURLs = WKMutableArrayCreate();
548f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
549f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            NSURL *nsURL;
550f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            for (nsURL in [openPanel URLs]) {
551f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                WKURLRef wkURL = WKURLCreateWithCFURL((CFURLRef)nsURL);
552f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                WKArrayAppendItem(fileURLs, wkURL);
553f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                WKRelease(wkURL);
554f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            }
555f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
556f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            WKOpenPanelResultListenerChooseFiles(listener, fileURLs);
557f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
558f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            WKRelease(fileURLs);
559f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        } else
560f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            WKOpenPanelResultListenerCancel(listener);
561f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
562f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        WKRelease(listener);
563f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }];
564f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
565f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
566dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)awakeFromNib
567dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
568f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _webView = [[WKView alloc] initWithFrame:[containerView frame] contextRef:_context];
569dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
570dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [containerView addSubview:_webView];
571dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [_webView setFrame:[containerView frame]];
572dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
573dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [_webView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
574dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
575dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WKPageLoaderClient loadClient = {
576dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        0,      /* version */
577dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self,   /* clientInfo */
5780617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        didStartProvisionalLoadForFrame,
5790617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        didReceiveServerRedirectForProvisionalLoadForFrame,
5800617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        didFailProvisionalLoadWithErrorForFrame,
5810617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        didCommitLoadForFrame,
5825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        didFinishDocumentLoadForFrame,
5830617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        didFinishLoadForFrame,
5840617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        didFailLoadWithErrorForFrame,
585f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        didSameDocumentNavigationForFrame,
5860617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        didReceiveTitleForFrame,
5870617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        didFirstLayoutForFrame,
5880617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        didFirstVisuallyNonEmptyLayoutForFrame,
589bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        didRemoveFrameFromHierarchy,
590e14391e94c850b8bd03680c23b38978db68687a8John Reck        didDisplayInsecureContentForFrame,
591e14391e94c850b8bd03680c23b38978db68687a8John Reck        didRunInsecureContentForFrame,
592f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        0, // canAuthenticateAgainstProtectionSpaceInFrame
593f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        0, // didReceiveAuthenticationChallengeInFrame
5940617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        didStartProgress,
5950617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        didChangeProgress,
5960617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        didFinishProgress,
5970617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        didBecomeUnresponsive,
5980617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        didBecomeResponsive,
5990617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        processDidExit,
60081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        didChangeBackForwardList,
60181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        0 // shouldGoToBackForwardItem
602dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    };
603dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WKPageSetPageLoaderClient(_webView.pageRef, &loadClient);
604dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
605dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WKPagePolicyClient policyClient = {
606dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        0,          /* version */
607dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self,       /* clientInfo */
6080617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        decidePolicyForNavigationAction,
6090617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        decidePolicyForNewWindowAction,
61081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        decidePolicyForResponse,
61181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        0           /* unableToImplementPolicy */
612dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    };
613dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WKPageSetPagePolicyClient(_webView.pageRef, &policyClient);
614dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
615dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WKPageUIClient uiClient = {
616dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        0,          /* version */
617dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        self,       /* clientInfo */
6180617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        createNewPage,
6190617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        showPage,
6200617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        closePage,
6212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        0,          /* takeFocus */
6222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        0,          /* focus */
6232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        0,          /* unfocus */
6240617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        runJavaScriptAlert,
6250617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        runJavaScriptConfirm,
626f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        runJavaScriptPrompt,
62768513a70bcd92384395513322f1b801e7bf9c729Steve Block        setStatusText,
628bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        mouseDidMoveOverElement,
629f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        0,          /* missingPluginButtonClicked */
630a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        0,          /* didNotHandleKeyEvent */
631e14391e94c850b8bd03680c23b38978db68687a8John Reck        0,          /* toolbarsAreVisible */
632e14391e94c850b8bd03680c23b38978db68687a8John Reck        0,          /* setToolbarsAreVisible */
633e14391e94c850b8bd03680c23b38978db68687a8John Reck        0,          /* menuBarIsVisible */
634e14391e94c850b8bd03680c23b38978db68687a8John Reck        0,          /* setMenuBarIsVisible */
635e14391e94c850b8bd03680c23b38978db68687a8John Reck        0,          /* statusBarIsVisible */
636e14391e94c850b8bd03680c23b38978db68687a8John Reck        0,          /* setStatusBarIsVisible */
637e14391e94c850b8bd03680c23b38978db68687a8John Reck        0,          /* isResizable */
638e14391e94c850b8bd03680c23b38978db68687a8John Reck        0,          /* setIsResizable */
639a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        getWindowFrame,
640a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        setWindowFrame,
641a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        runBeforeUnloadConfirmPanel,
642e14391e94c850b8bd03680c23b38978db68687a8John Reck        0,          /* didDraw */
643f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        0,          /* pageDidScroll */
644f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        0,          /* exceededDatabaseQuota */
64565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        runOpenPanel,
64665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        0,          /* decidePolicyForGeolocationPermissionRequest */
647ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        0, // headerHeight
648ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        0, // footerHeight
649ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        0, // drawHeader
650ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        0, // drawFooter
651ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        0, // printFrame
652ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        0, // showModal
6532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        0, // didCompleteRubberBandForMainFrame
6542bde8e466a4451c7319e3a072d118917957d6554Steve Block        0, // saveDataToFileInDownloadsFolder
655dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    };
656dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WKPageSetPageUIClient(_webView.pageRef, &uiClient);
657dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
658dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
659dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)didStartProgress
660dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
661dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [progressIndicator setDoubleValue:0.0];
662dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [progressIndicator setHidden:NO];
663dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
664dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
665dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)didChangeProgress:(double)value
666dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
667dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [progressIndicator setDoubleValue:value];
668dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
669dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
670dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)didFinishProgress
671dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
672dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [progressIndicator setHidden:YES];
673dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [progressIndicator setDoubleValue:1.0];
674dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
675dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
676967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)updateProvisionalURLForFrame:(WKFrameRef)frame
677967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
678a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    static WKURLRef emptyURL = 0;
679a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!emptyURL)
680a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        emptyURL = WKURLCreateWithUTF8CString("");
681a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
6820617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    WKURLRef url = WKFrameCopyProvisionalURL(frame);
683a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (WKURLIsEqual(url, emptyURL)) {
684a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        WKRelease(url);
685967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return;
686a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
687967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
688967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    CFURLRef cfSourceURL = WKURLCopyCFURL(0, url);
689e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    WKRelease(url);
6900617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
691967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    [urlText setStringValue:(NSString*)CFURLGetString(cfSourceURL)];
692967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    CFRelease(cfSourceURL);
693967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
694967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
695967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)didStartProvisionalLoadForFrame:(WKFrameRef)frame
696967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
697967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (!WKFrameIsMainFrame(frame))
698967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return;
699967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
700967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    [self updateProvisionalURLForFrame:frame];
701967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
702967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
703967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)didReceiveServerRedirectForProvisionalLoadForFrame:(WKFrameRef)frame
704967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
705967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (!WKFrameIsMainFrame(frame))
706967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return;
707967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
708967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    [self updateProvisionalURLForFrame:frame];
709967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
710967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
711967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)didFailProvisionalLoadWithErrorForFrame:(WKFrameRef)frame
712967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
713967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (!WKFrameIsMainFrame(frame))
714967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return;
715967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
716967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    [self updateProvisionalURLForFrame:frame];
717967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
718967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
719967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)didFailLoadWithErrorForFrame:(WKFrameRef)frame
720967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
721967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (!WKFrameIsMainFrame(frame))
722967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return;
723967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
724967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    [self updateProvisionalURLForFrame:frame];
725967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
726967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
727f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch- (void)didSameDocumentNavigationForFrame:(WKFrameRef)frame
728f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
729f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
730f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
731967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)didCommitLoadForFrame:(WKFrameRef)frame
732967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
733967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
734967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
735dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)loadURLString:(NSString *)urlString
736dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
737dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // FIXME: We shouldn't have to set the url text here.
738dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [urlText setStringValue:urlString];
739dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [self fetch:nil];
740dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
741dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
742a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch- (IBAction)performFindPanelAction:(id)sender
743a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
744a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    [findPanelWindow makeKeyAndOrderFront:sender];
745a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
746a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
747a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch- (IBAction)find:(id)sender
748a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
749a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    WKStringRef string = WKStringCreateWithCFString((CFStringRef)[sender stringValue]);
750a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
751f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    WKPageFindString(_webView.pageRef, string, kWKFindOptionsCaseInsensitive | kWKFindOptionsWrapAround | kWKFindOptionsShowFindIndicator | kWKFindOptionsShowOverlay, 100);
752a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
753a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
754dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block@end
755