BrowserWindowController.m revision ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddb
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 3540617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic void didChangeBackForwardList(WKPageRef page, const void *clientInfo) 355967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{ 356967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch [(BrowserWindowController *)clientInfo validateToolbar]; 357967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch} 358967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 359cad810f21b803229eb11403f9209855525a25d57Steve Block// MARK: Policy Client Callbacks 360dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 36168513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic void decidePolicyForNavigationAction(WKPageRef page, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRef url, WKFrameRef frame, WKFramePolicyListenerRef listener, const void *clientInfo) 362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 36306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen LOG(@"decidePolicyForNavigationAction"); 364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WKFramePolicyListenerUse(listener); 365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 36768513a70bcd92384395513322f1b801e7bf9c729Steve Blockstatic void decidePolicyForNewWindowAction(WKPageRef page, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRef url, WKFrameRef frame, WKFramePolicyListenerRef listener, const void *clientInfo) 368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 36906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen LOG(@"decidePolicyForNewWindowAction"); 370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WKFramePolicyListenerUse(listener); 371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 372dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 3730617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic void decidePolicyForMIMEType(WKPageRef page, WKStringRef MIMEType, WKURLRef url, WKFrameRef frame, WKFramePolicyListenerRef listener, 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, 6000617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen didChangeBackForwardList 601dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block }; 602dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WKPageSetPageLoaderClient(_webView.pageRef, &loadClient); 603dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 604dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WKPagePolicyClient policyClient = { 605dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 0, /* version */ 606dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block self, /* clientInfo */ 6070617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen decidePolicyForNavigationAction, 6080617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen decidePolicyForNewWindowAction, 6090617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen decidePolicyForMIMEType 610dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block }; 611dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WKPageSetPagePolicyClient(_webView.pageRef, &policyClient); 612dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 613dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WKPageUIClient uiClient = { 614dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 0, /* version */ 615dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block self, /* clientInfo */ 6160617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen createNewPage, 6170617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen showPage, 6180617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen closePage, 6190617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen runJavaScriptAlert, 6200617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen runJavaScriptConfirm, 621f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick runJavaScriptPrompt, 62268513a70bcd92384395513322f1b801e7bf9c729Steve Block setStatusText, 623bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen mouseDidMoveOverElement, 624f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 0, /* missingPluginButtonClicked */ 625a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 0, /* didNotHandleKeyEvent */ 626e14391e94c850b8bd03680c23b38978db68687a8John Reck 0, /* toolbarsAreVisible */ 627e14391e94c850b8bd03680c23b38978db68687a8John Reck 0, /* setToolbarsAreVisible */ 628e14391e94c850b8bd03680c23b38978db68687a8John Reck 0, /* menuBarIsVisible */ 629e14391e94c850b8bd03680c23b38978db68687a8John Reck 0, /* setMenuBarIsVisible */ 630e14391e94c850b8bd03680c23b38978db68687a8John Reck 0, /* statusBarIsVisible */ 631e14391e94c850b8bd03680c23b38978db68687a8John Reck 0, /* setStatusBarIsVisible */ 632e14391e94c850b8bd03680c23b38978db68687a8John Reck 0, /* isResizable */ 633e14391e94c850b8bd03680c23b38978db68687a8John Reck 0, /* setIsResizable */ 634a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch getWindowFrame, 635a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch setWindowFrame, 636a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch runBeforeUnloadConfirmPanel, 637e14391e94c850b8bd03680c23b38978db68687a8John Reck 0, /* didDraw */ 638f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 0, /* pageDidScroll */ 639f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 0, /* exceededDatabaseQuota */ 64065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch runOpenPanel, 64165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 0, /* decidePolicyForGeolocationPermissionRequest */ 642ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 0, // headerHeight 643ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 0, // footerHeight 644ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 0, // drawHeader 645ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 0, // drawFooter 646ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 0, // printFrame 647ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 0, // showModal 648dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block }; 649dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WKPageSetPageUIClient(_webView.pageRef, &uiClient); 650dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 651dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 652dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)didStartProgress 653dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 654dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block [progressIndicator setDoubleValue:0.0]; 655dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block [progressIndicator setHidden:NO]; 656dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 657dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 658dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)didChangeProgress:(double)value 659dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 660dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block [progressIndicator setDoubleValue:value]; 661dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 662dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 663dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)didFinishProgress 664dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 665dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block [progressIndicator setHidden:YES]; 666dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block [progressIndicator setDoubleValue:1.0]; 667dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 668dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 669967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)updateProvisionalURLForFrame:(WKFrameRef)frame 670967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{ 671a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch static WKURLRef emptyURL = 0; 672a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (!emptyURL) 673a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch emptyURL = WKURLCreateWithUTF8CString(""); 674a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 6750617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen WKURLRef url = WKFrameCopyProvisionalURL(frame); 676a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (WKURLIsEqual(url, emptyURL)) { 677a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch WKRelease(url); 678967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return; 679a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch } 680967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 681967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch CFURLRef cfSourceURL = WKURLCopyCFURL(0, url); 682e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block WKRelease(url); 6830617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen 684967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch [urlText setStringValue:(NSString*)CFURLGetString(cfSourceURL)]; 685967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch CFRelease(cfSourceURL); 686967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch} 687967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 688967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)didStartProvisionalLoadForFrame:(WKFrameRef)frame 689967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{ 690967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (!WKFrameIsMainFrame(frame)) 691967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return; 692967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 693967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch [self updateProvisionalURLForFrame:frame]; 694967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch} 695967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 696967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)didReceiveServerRedirectForProvisionalLoadForFrame:(WKFrameRef)frame 697967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{ 698967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (!WKFrameIsMainFrame(frame)) 699967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return; 700967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 701967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch [self updateProvisionalURLForFrame:frame]; 702967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch} 703967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 704967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)didFailProvisionalLoadWithErrorForFrame:(WKFrameRef)frame 705967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{ 706967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (!WKFrameIsMainFrame(frame)) 707967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return; 708967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 709967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch [self updateProvisionalURLForFrame:frame]; 710967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch} 711967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 712967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)didFailLoadWithErrorForFrame:(WKFrameRef)frame 713967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{ 714967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (!WKFrameIsMainFrame(frame)) 715967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return; 716967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 717967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch [self updateProvisionalURLForFrame:frame]; 718967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch} 719967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 720f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch- (void)didSameDocumentNavigationForFrame:(WKFrameRef)frame 721f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 722f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 723f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 724967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)didCommitLoadForFrame:(WKFrameRef)frame 725967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{ 726967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch} 727967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 728dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)loadURLString:(NSString *)urlString 729dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 730dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // FIXME: We shouldn't have to set the url text here. 731dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block [urlText setStringValue:urlString]; 732dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block [self fetch:nil]; 733dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 734dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 735a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch- (IBAction)performFindPanelAction:(id)sender 736a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{ 737a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch [findPanelWindow makeKeyAndOrderFront:sender]; 738a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch} 739a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 740a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch- (IBAction)find:(id)sender 741a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{ 742a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch WKStringRef string = WKStringCreateWithCFString((CFStringRef)[sender stringValue]); 743a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 744f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch WKPageFindString(_webView.pageRef, string, kWKFindOptionsCaseInsensitive | kWKFindOptionsWrapAround | kWKFindOptionsShowFindIndicator | kWKFindOptionsShowOverlay, 100); 745a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch} 746a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 747dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block@end 748