blob: f6b4d1d8f2d21f6ee0af7fc6fab396206b7d4d90 [file] [log] [blame]
/*
* Copyright (C) 2010 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#import "BrowserWindowController.h"
#import <WebKit2/WKPagePrivate.h>
#import <WebKit2/WKStringCF.h>
#import <WebKit2/WKURLCF.h>
@interface BrowserWindowController ()
- (void)didStartProgress;
- (void)didChangeProgress:(double)value;
- (void)didFinishProgress;
- (void)didStartProvisionalLoadForFrame:(WKFrameRef)frame;
- (void)didCommitLoadForFrame:(WKFrameRef)frame;
- (void)didReceiveServerRedirectForProvisionalLoadForFrame:(WKFrameRef)frame;
- (void)didFailProvisionalLoadWithErrorForFrame:(WKFrameRef)frame;
- (void)didFailLoadWithErrorForFrame:(WKFrameRef)frame;
- (void)didSameDocumentNavigationForFrame:(WKFrameRef)frame;
@end
@implementation BrowserWindowController
- (id)initWithContext:(WKContextRef)context
{
if ((self = [super initWithWindowNibName:@"BrowserWindow"])) {
_context = WKRetain(context);
_zoomTextOnly = NO;
}
return self;
}
- (void)dealloc
{
assert(!_context);
[super dealloc];
}
- (IBAction)fetch:(id)sender
{
CFURLRef cfURL = CFURLCreateWithString(0, (CFStringRef)[urlText stringValue], 0);
if (!cfURL)
return;
WKURLRef url = WKURLCreateWithCFURL(cfURL);
CFRelease(cfURL);
WKPageLoadURL(_webView.pageRef, url);
WKRelease(url);
}
- (IBAction)showHideWebView:(id)sender
{
BOOL hidden = ![_webView isHidden];
[_webView setHidden:hidden];
}
- (IBAction)removeReinsertWebView:(id)sender
{
if ([_webView window]) {
[_webView retain];
[_webView removeFromSuperview];
} else {
[containerView addSubview:_webView];
[_webView release];
}
}
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
{
SEL action = [menuItem action];
if (action == @selector(zoomIn:))
return [self canZoomIn];
if (action == @selector(zoomOut:))
return [self canZoomOut];
if (action == @selector(resetZoom:))
return [self canResetZoom];
if (action == @selector(showHideWebView:))
[menuItem setTitle:[_webView isHidden] ? @"Show Web View" : @"Hide Web View"];
else if (action == @selector(removeReinsertWebView:))
[menuItem setTitle:[_webView window] ? @"Remove Web View" : @"Insert Web View"];
else if (action == @selector(toggleZoomMode:))
[menuItem setState:_zoomTextOnly ? NSOnState : NSOffState];
return YES;
}
- (IBAction)reload:(id)sender
{
WKPageReload(_webView.pageRef);
}
- (IBAction)forceRepaint:(id)sender
{
[_webView setNeedsDisplay:YES];
}
- (IBAction)goBack:(id)sender
{
WKPageGoBack(_webView.pageRef);
}
- (IBAction)goForward:(id)sender
{
WKPageGoForward(_webView.pageRef);
}
- (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item
{
SEL action = [item action];
if (action == @selector(goBack:))
return _webView && WKPageCanGoBack(_webView.pageRef);
if (action == @selector(goForward:))
return _webView && WKPageCanGoForward(_webView.pageRef);
return YES;
}
- (void)validateToolbar
{
[toolbar validateVisibleItems];
}
- (BOOL)windowShouldClose:(id)sender
{
LOG(@"windowShouldClose");
BOOL canCloseImmediately = WKPageTryClose(_webView.pageRef);
return canCloseImmediately;
}
- (void)windowWillClose:(NSNotification *)notification
{
WKRelease(_context);
_context = 0;
}
- (void)applicationTerminating
{
WKPageClose(_webView.pageRef);
WKRelease(_webView.pageRef);
}
#define DefaultMinimumZoomFactor (.5)
#define DefaultMaximumZoomFactor (3.0)
#define DefaultZoomFactorRatio (1.2)
- (double)currentZoomFactor
{
return _zoomTextOnly ? WKPageGetTextZoomFactor(_webView.pageRef) : WKPageGetPageZoomFactor(_webView.pageRef);
}
- (void)setCurrentZoomFactor:(double)factor
{
_zoomTextOnly ? WKPageSetTextZoomFactor(_webView.pageRef, factor) : WKPageSetPageZoomFactor(_webView.pageRef, factor);
}
- (BOOL)canZoomIn
{
return [self currentZoomFactor] * DefaultZoomFactorRatio < DefaultMaximumZoomFactor;
}
- (void)zoomIn:(id)sender
{
if (![self canZoomIn])
return;
double factor = [self currentZoomFactor] * DefaultZoomFactorRatio;
[self setCurrentZoomFactor:factor];
}
- (BOOL)canZoomOut
{
return [self currentZoomFactor] / DefaultZoomFactorRatio > DefaultMinimumZoomFactor;
}
- (void)zoomOut:(id)sender
{
if (![self canZoomIn])
return;
double factor = [self currentZoomFactor] / DefaultZoomFactorRatio;
[self setCurrentZoomFactor:factor];
}
- (BOOL)canResetZoom
{
return _zoomTextOnly ? (WKPageGetTextZoomFactor(_webView.pageRef) != 1) : (WKPageGetPageZoomFactor(_webView.pageRef) != 1);
}
- (void)resetZoom:(id)sender
{
if (![self canResetZoom])
return;
if (_zoomTextOnly)
WKPageSetTextZoomFactor(_webView.pageRef, 1);
else
WKPageSetPageZoomFactor(_webView.pageRef, 1);
}
- (IBAction)toggleZoomMode:(id)sender
{
if (_zoomTextOnly) {
_zoomTextOnly = NO;
double currentTextZoom = WKPageGetTextZoomFactor(_webView.pageRef);
WKPageSetPageAndTextZoomFactors(_webView.pageRef, currentTextZoom, 1);
} else {
_zoomTextOnly = YES;
double currentPageZoom = WKPageGetPageZoomFactor(_webView.pageRef);
WKPageSetPageAndTextZoomFactors(_webView.pageRef, 1, currentPageZoom);
}
}
- (IBAction)dumpSourceToConsole:(id)sender
{
WKPageGetSourceForFrame_b(_webView.pageRef, WKPageGetMainFrame(_webView.pageRef), ^(WKStringRef result, WKErrorRef error) {
CFStringRef cfResult = WKStringCopyCFString(0, result);
LOG(@"Main frame source\n \"%@\"", (NSString *)cfResult);
CFRelease(cfResult);
});
}
// MARK: Loader Client Callbacks
static void didStartProvisionalLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
{
[(BrowserWindowController *)clientInfo didStartProvisionalLoadForFrame:frame];
}
static void didReceiveServerRedirectForProvisionalLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
{
[(BrowserWindowController *)clientInfo didReceiveServerRedirectForProvisionalLoadForFrame:frame];
}
static void didFailProvisionalLoadWithErrorForFrame(WKPageRef page, WKFrameRef frame, WKErrorRef error, WKTypeRef userData, const void *clientInfo)
{
[(BrowserWindowController *)clientInfo didFailProvisionalLoadWithErrorForFrame:frame];
}
static void didCommitLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
{
[(BrowserWindowController *)clientInfo didCommitLoadForFrame:frame];
}
static void didFinishDocumentLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
{
LOG(@"didFinishDocumentLoadForFrame");
}
static void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
{
LOG(@"didFinishLoadForFrame");
}
static void didFailLoadWithErrorForFrame(WKPageRef page, WKFrameRef frame, WKErrorRef error, WKTypeRef userData, const void *clientInfo)
{
[(BrowserWindowController *)clientInfo didFailLoadWithErrorForFrame:frame];
}
static void didSameDocumentNavigationForFrame(WKPageRef page, WKFrameRef frame, WKSameDocumentNavigationType type, WKTypeRef userData, const void *clientInfo)
{
[(BrowserWindowController *)clientInfo didSameDocumentNavigationForFrame:frame];
}
static void didReceiveTitleForFrame(WKPageRef page, WKStringRef title, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
{
CFStringRef cfTitle = WKStringCopyCFString(0, title);
LOG(@"didReceiveTitleForFrame \"%@\"", (NSString *)cfTitle);
CFRelease(cfTitle);
}
static void didFirstLayoutForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
{
LOG(@"didFirstLayoutForFrame");
}
static void didFirstVisuallyNonEmptyLayoutForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
{
LOG(@"didFirstVisuallyNonEmptyLayoutForFrame");
}
static void didRemoveFrameFromHierarchy(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
{
LOG(@"didRemoveFrameFromHierarchy");
}
static void didDisplayInsecureContentForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
{
LOG(@"didDisplayInsecureContentForFrame");
}
static void didRunInsecureContentForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
{
LOG(@"didRunInsecureContentForFrame");
}
static void didStartProgress(WKPageRef page, const void *clientInfo)
{
[(BrowserWindowController *)clientInfo didStartProgress];
}
static void didChangeProgress(WKPageRef page, const void *clientInfo)
{
[(BrowserWindowController *)clientInfo didChangeProgress:WKPageGetEstimatedProgress(page)];
}
static void didFinishProgress(WKPageRef page, const void *clientInfo)
{
[(BrowserWindowController *)clientInfo didFinishProgress];
}
static void didBecomeUnresponsive(WKPageRef page, const void *clientInfo)
{
LOG(@"didBecomeUnresponsive");
}
static void didBecomeResponsive(WKPageRef page, const void *clientInfo)
{
LOG(@"didBecomeResponsive");
}
static void processDidExit(WKPageRef page, const void *clientInfo)
{
LOG(@"processDidExit");
}
static void didChangeBackForwardList(WKPageRef page, WKBackForwardListItemRef addedItem, WKArrayRef removedItems, const void *clientInfo)
{
[(BrowserWindowController *)clientInfo validateToolbar];
}
// MARK: Policy Client Callbacks
static void decidePolicyForNavigationAction(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
{
LOG(@"decidePolicyForNavigationAction");
WKFramePolicyListenerUse(listener);
}
static void decidePolicyForNewWindowAction(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRequestRef request, WKStringRef frameName, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
{
LOG(@"decidePolicyForNewWindowAction");
WKFramePolicyListenerUse(listener);
}
static void decidePolicyForResponse(WKPageRef page, WKFrameRef frame, WKURLResponseRef response, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
{
WKFramePolicyListenerUse(listener);
}
// MARK: UI Client Callbacks
static WKPageRef createNewPage(WKPageRef page, WKDictionaryRef features, WKEventModifiers modifiers, WKEventMouseButton button, const void* clientInfo)
{
LOG(@"createNewPage");
BrowserWindowController *controller = [[BrowserWindowController alloc] initWithContext:WKPageGetContext(page)];
[controller loadWindow];
return controller->_webView.pageRef;
}
static void showPage(WKPageRef page, const void *clientInfo)
{
LOG(@"showPage");
[[(BrowserWindowController *)clientInfo window] orderFront:nil];
}
static void closePage(WKPageRef page, const void *clientInfo)
{
LOG(@"closePage");
WKPageClose(page);
[[(BrowserWindowController *)clientInfo window] close];
WKRelease(page);
}
static void runJavaScriptAlert(WKPageRef page, WKStringRef message, WKFrameRef frame, const void* clientInfo)
{
NSAlert* alert = [[NSAlert alloc] init];
WKURLRef wkURL = WKFrameCopyURL(frame);
CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
WKRelease(wkURL);
[alert setMessageText:[NSString stringWithFormat:@"JavaScript alert dialog from %@.", [(NSURL *)cfURL absoluteString]]];
CFRelease(cfURL);
CFStringRef cfMessage = WKStringCopyCFString(0, message);
[alert setInformativeText:(NSString *)cfMessage];
CFRelease(cfMessage);
[alert addButtonWithTitle:@"OK"];
[alert runModal];
[alert release];
}
static bool runJavaScriptConfirm(WKPageRef page, WKStringRef message, WKFrameRef frame, const void* clientInfo)
{
NSAlert* alert = [[NSAlert alloc] init];
WKURLRef wkURL = WKFrameCopyURL(frame);
CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
WKRelease(wkURL);
[alert setMessageText:[NSString stringWithFormat:@"JavaScript confirm dialog from %@.", [(NSURL *)cfURL absoluteString]]];
CFRelease(cfURL);
CFStringRef cfMessage = WKStringCopyCFString(0, message);
[alert setInformativeText:(NSString *)cfMessage];
CFRelease(cfMessage);
[alert addButtonWithTitle:@"OK"];
[alert addButtonWithTitle:@"Cancel"];
NSInteger button = [alert runModal];
[alert release];
return button == NSAlertFirstButtonReturn;
}
static WKStringRef runJavaScriptPrompt(WKPageRef page, WKStringRef message, WKStringRef defaultValue, WKFrameRef frame, const void* clientInfo)
{
NSAlert* alert = [[NSAlert alloc] init];
WKURLRef wkURL = WKFrameCopyURL(frame);
CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
WKRelease(wkURL);
[alert setMessageText:[NSString stringWithFormat:@"JavaScript prompt dialog from %@.", [(NSURL *)cfURL absoluteString]]];
CFRelease(cfURL);
CFStringRef cfMessage = WKStringCopyCFString(0, message);
[alert setInformativeText:(NSString *)cfMessage];
CFRelease(cfMessage);
[alert addButtonWithTitle:@"OK"];
[alert addButtonWithTitle:@"Cancel"];
NSTextField* input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 24)];
CFStringRef cfDefaultValue = WKStringCopyCFString(0, defaultValue);
[input setStringValue:(NSString *)cfDefaultValue];
CFRelease(cfDefaultValue);
[alert setAccessoryView:input];
NSInteger button = [alert runModal];
NSString* result = nil;
if (button == NSAlertFirstButtonReturn) {
[input validateEditing];
result = [input stringValue];
}
[alert release];
if (!result)
return 0;
return WKStringCreateWithCFString((CFStringRef)result);
}
static void setStatusText(WKPageRef page, WKStringRef text, const void* clientInfo)
{
LOG(@"setStatusText");
}
static void mouseDidMoveOverElement(WKPageRef page, WKEventModifiers modifiers, WKTypeRef userData, const void *clientInfo)
{
LOG(@"mouseDidMoveOverElement");
}
static WKRect getWindowFrame(WKPageRef page, const void* clientInfo)
{
NSRect rect = [[(BrowserWindowController *)clientInfo window] frame];
WKRect wkRect;
wkRect.origin.x = rect.origin.x;
wkRect.origin.y = rect.origin.y;
wkRect.size.width = rect.size.width;
wkRect.size.height = rect.size.height;
return wkRect;
}
static void setWindowFrame(WKPageRef page, WKRect rect, const void* clientInfo)
{
[[(BrowserWindowController *)clientInfo window] setFrame:NSMakeRect(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height) display:YES];
}
static bool runBeforeUnloadConfirmPanel(WKPageRef page, WKStringRef message, WKFrameRef frame, const void* clientInfo)
{
NSAlert *alert = [[NSAlert alloc] init];
WKURLRef wkURL = WKFrameCopyURL(frame);
CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
WKRelease(wkURL);
[alert setMessageText:[NSString stringWithFormat:@"BeforeUnload confirm dialog from %@.", [(NSURL *)cfURL absoluteString]]];
CFRelease(cfURL);
CFStringRef cfMessage = WKStringCopyCFString(0, message);
[alert setInformativeText:(NSString *)cfMessage];
CFRelease(cfMessage);
[alert addButtonWithTitle:@"OK"];
[alert addButtonWithTitle:@"Cancel"];
NSInteger button = [alert runModal];
[alert release];
return button == NSAlertFirstButtonReturn;
}
static void runOpenPanel(WKPageRef page, WKFrameRef frame, WKOpenPanelParametersRef parameters, WKOpenPanelResultListenerRef listener, const void* clientInfo)
{
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel setAllowsMultipleSelection:WKOpenPanelParametersGetAllowsMultipleFiles(parameters)];
WKRetain(listener);
[openPanel beginSheetModalForWindow:[(BrowserWindowController *)clientInfo window] completionHandler:^(NSInteger result) {
if (result == NSFileHandlingPanelOKButton) {
WKMutableArrayRef fileURLs = WKMutableArrayCreate();
NSURL *nsURL;
for (nsURL in [openPanel URLs]) {
WKURLRef wkURL = WKURLCreateWithCFURL((CFURLRef)nsURL);
WKArrayAppendItem(fileURLs, wkURL);
WKRelease(wkURL);
}
WKOpenPanelResultListenerChooseFiles(listener, fileURLs);
WKRelease(fileURLs);
} else
WKOpenPanelResultListenerCancel(listener);
WKRelease(listener);
}];
}
- (void)awakeFromNib
{
_webView = [[WKView alloc] initWithFrame:[containerView frame] contextRef:_context];
[containerView addSubview:_webView];
[_webView setFrame:[containerView frame]];
[_webView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
WKPageLoaderClient loadClient = {
0, /* version */
self, /* clientInfo */
didStartProvisionalLoadForFrame,
didReceiveServerRedirectForProvisionalLoadForFrame,
didFailProvisionalLoadWithErrorForFrame,
didCommitLoadForFrame,
didFinishDocumentLoadForFrame,
didFinishLoadForFrame,
didFailLoadWithErrorForFrame,
didSameDocumentNavigationForFrame,
didReceiveTitleForFrame,
didFirstLayoutForFrame,
didFirstVisuallyNonEmptyLayoutForFrame,
didRemoveFrameFromHierarchy,
didDisplayInsecureContentForFrame,
didRunInsecureContentForFrame,
0, // canAuthenticateAgainstProtectionSpaceInFrame
0, // didReceiveAuthenticationChallengeInFrame
didStartProgress,
didChangeProgress,
didFinishProgress,
didBecomeUnresponsive,
didBecomeResponsive,
processDidExit,
didChangeBackForwardList,
0 // shouldGoToBackForwardItem
};
WKPageSetPageLoaderClient(_webView.pageRef, &loadClient);
WKPagePolicyClient policyClient = {
0, /* version */
self, /* clientInfo */
decidePolicyForNavigationAction,
decidePolicyForNewWindowAction,
decidePolicyForResponse,
0 /* unableToImplementPolicy */
};
WKPageSetPagePolicyClient(_webView.pageRef, &policyClient);
WKPageUIClient uiClient = {
0, /* version */
self, /* clientInfo */
createNewPage,
showPage,
closePage,
0, /* takeFocus */
0, /* focus */
0, /* unfocus */
runJavaScriptAlert,
runJavaScriptConfirm,
runJavaScriptPrompt,
setStatusText,
mouseDidMoveOverElement,
0, /* missingPluginButtonClicked */
0, /* didNotHandleKeyEvent */
0, /* toolbarsAreVisible */
0, /* setToolbarsAreVisible */
0, /* menuBarIsVisible */
0, /* setMenuBarIsVisible */
0, /* statusBarIsVisible */
0, /* setStatusBarIsVisible */
0, /* isResizable */
0, /* setIsResizable */
getWindowFrame,
setWindowFrame,
runBeforeUnloadConfirmPanel,
0, /* didDraw */
0, /* pageDidScroll */
0, /* exceededDatabaseQuota */
runOpenPanel,
0, /* decidePolicyForGeolocationPermissionRequest */
0, // headerHeight
0, // footerHeight
0, // drawHeader
0, // drawFooter
0, // printFrame
0, // showModal
0, // didCompleteRubberBandForMainFrame
0, // saveDataToFileInDownloadsFolder
};
WKPageSetPageUIClient(_webView.pageRef, &uiClient);
}
- (void)didStartProgress
{
[progressIndicator setDoubleValue:0.0];
[progressIndicator setHidden:NO];
}
- (void)didChangeProgress:(double)value
{
[progressIndicator setDoubleValue:value];
}
- (void)didFinishProgress
{
[progressIndicator setHidden:YES];
[progressIndicator setDoubleValue:1.0];
}
- (void)updateProvisionalURLForFrame:(WKFrameRef)frame
{
static WKURLRef emptyURL = 0;
if (!emptyURL)
emptyURL = WKURLCreateWithUTF8CString("");
WKURLRef url = WKFrameCopyProvisionalURL(frame);
if (WKURLIsEqual(url, emptyURL)) {
WKRelease(url);
return;
}
CFURLRef cfSourceURL = WKURLCopyCFURL(0, url);
WKRelease(url);
[urlText setStringValue:(NSString*)CFURLGetString(cfSourceURL)];
CFRelease(cfSourceURL);
}
- (void)didStartProvisionalLoadForFrame:(WKFrameRef)frame
{
if (!WKFrameIsMainFrame(frame))
return;
[self updateProvisionalURLForFrame:frame];
}
- (void)didReceiveServerRedirectForProvisionalLoadForFrame:(WKFrameRef)frame
{
if (!WKFrameIsMainFrame(frame))
return;
[self updateProvisionalURLForFrame:frame];
}
- (void)didFailProvisionalLoadWithErrorForFrame:(WKFrameRef)frame
{
if (!WKFrameIsMainFrame(frame))
return;
[self updateProvisionalURLForFrame:frame];
}
- (void)didFailLoadWithErrorForFrame:(WKFrameRef)frame
{
if (!WKFrameIsMainFrame(frame))
return;
[self updateProvisionalURLForFrame:frame];
}
- (void)didSameDocumentNavigationForFrame:(WKFrameRef)frame
{
}
- (void)didCommitLoadForFrame:(WKFrameRef)frame
{
}
- (void)loadURLString:(NSString *)urlString
{
// FIXME: We shouldn't have to set the url text here.
[urlText setStringValue:urlString];
[self fetch:nil];
}
- (IBAction)performFindPanelAction:(id)sender
{
[findPanelWindow makeKeyAndOrderFront:sender];
}
- (IBAction)find:(id)sender
{
WKStringRef string = WKStringCreateWithCFString((CFStringRef)[sender stringValue]);
WKPageFindString(_webView.pageRef, string, kWKFindOptionsCaseInsensitive | kWKFindOptionsWrapAround | kWKFindOptionsShowFindIndicator | kWKFindOptionsShowOverlay, 100);
}
@end