Changeset 165749 in webkit
- Timestamp:
- Mar 17, 2014 1:10:12 PM (10 years ago)
- Location:
- trunk/Tools
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Tools/ChangeLog
r165746 r165749 1 2014-03-17 Simon Fraser <simon.fraser@apple.com> 2 3 Convert MiniBrowser to use WKWebView API 4 https://bugs.webkit.org/show_bug.cgi?id=130061 5 6 Reviewed by Anders Carlsson. 7 8 Convert the MiniBrowser WK2 window to use WebKit2 API as much 9 as possible. 10 11 Some functionality was removed temporarily: 12 - text zoom, page zoom 13 - reload 14 - pagination mode 15 - transparent window 16 - dumping source 17 - window.open support 18 - beforeUnload panel 19 - find in page 20 21 * MiniBrowser/mac/AppDelegate.h: 22 * MiniBrowser/mac/AppDelegate.m: 23 (-[BrowserAppDelegate init]): 24 (-[BrowserAppDelegate newWindow:]): 25 (-[BrowserAppDelegate applicationWillTerminate:]): 26 (-[BrowserAppDelegate openDocument:]): 27 * MiniBrowser/mac/WK2BrowserWindowController.h: 28 * MiniBrowser/mac/WK2BrowserWindowController.m: 29 (-[WK2BrowserWindowController awakeFromNib]): 30 (-[WK2BrowserWindowController dealloc]): 31 (-[WK2BrowserWindowController fetch:]): 32 (-[WK2BrowserWindowController validateMenuItem:]): 33 (-[WK2BrowserWindowController reload:]): 34 (-[WK2BrowserWindowController goBack:]): 35 (-[WK2BrowserWindowController goForward:]): 36 (-[WK2BrowserWindowController toggleZoomMode:]): 37 (-[WK2BrowserWindowController resetZoom:]): 38 (-[WK2BrowserWindowController canResetZoom]): 39 (-[WK2BrowserWindowController dumpSourceToConsole:]): 40 (-[WK2BrowserWindowController togglePaginationMode:]): 41 (-[WK2BrowserWindowController validateUserInterfaceItem:]): 42 (-[WK2BrowserWindowController windowShouldClose:]): 43 (-[WK2BrowserWindowController applicationTerminating]): 44 (-[WK2BrowserWindowController currentZoomFactor]): 45 (-[WK2BrowserWindowController setCurrentZoomFactor:]): 46 (-[WK2BrowserWindowController toggleTransparentWindow:]): 47 (-[WK2BrowserWindowController observeValueForKeyPath:ofObject:change:context:]): 48 (-[WK2BrowserWindowController webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]): 49 (-[WK2BrowserWindowController webView:runJavaScriptConfirmPanelWithMessage:initiatedByFrame:completionHandler:]): 50 (-[WK2BrowserWindowController webView:runJavaScriptTextInputPanelWithPrompt:defaultText:initiatedByFrame:completionHandler:]): 51 (-[WK2BrowserWindowController find:]): 52 (-[WK2BrowserWindowController webView:decidePolicyForNavigationResponse:decisionHandler:]): 53 (-[WK2BrowserWindowController webView:didStartProvisionalNavigation:]): 54 (-[WK2BrowserWindowController webView:didReceiveServerRedirectForProvisionalNavigation:]): 55 (-[WK2BrowserWindowController webView:didFailProvisionalNavigation:withError:]): 56 (-[WK2BrowserWindowController webView:didCommitNavigation:]): 57 (-[WK2BrowserWindowController webView:didFinishLoadingNavigation:]): 58 (-[WK2BrowserWindowController webView:didFailNavigation:withError:]): 59 * WebKitTestRunner/PlatformWebView.h: 60 * WebKitTestRunner/ios/PlatformWebViewIOS.mm: 61 * WebKitTestRunner/mac/PlatformWebViewMac.mm: 62 1 63 2014-03-17 Zan Dobersek <zdobersek@igalia.com> 2 64 -
trunk/Tools/MiniBrowser/mac/AppDelegate.h
r160298 r165749 24 24 */ 25 25 26 #import <WebKit2/WebKit2.h>27 28 26 @interface BrowserAppDelegate : NSObject <NSApplicationDelegate> { 29 #if WK_API_ENABLED30 WKProcessGroup *_processGroup;31 WKBrowsingContextGroup *_browsingContextGroup;32 #endif33 27 NSMutableSet *_browserWindows; 34 28 } -
trunk/Tools/MiniBrowser/mac/AppDelegate.m
r164624 r165749 30 30 #import <WebKit/WebHistory.h> 31 31 #import <WebKit2/WebKit2.h> 32 #import <WebKit2/WKStringCF.h>33 #import <WebKit2/WKURLCF.h>34 32 35 33 static NSString *defaultURL = @"http://www.webkit.org/"; … … 46 44 self = [super init]; 47 45 if (self) { 48 #if WK_API_ENABLED49 NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForAuxiliaryExecutable:@"MiniBrowser.wkbundle"]];50 _processGroup = [[WKProcessGroup alloc] initWithInjectedBundleURL:url];51 _browsingContextGroup = [[WKBrowsingContextGroup alloc] initWithIdentifier:@"MiniBrowser"];52 #endif53 46 _browserWindows = [[NSMutableSet alloc] init]; 54 47 } … … 65 58 #if WK_API_ENABLED 66 59 else if ([sender tag] == WebKit2NewWindowTag) 67 controller = [[WK2BrowserWindowController alloc] initWith ProcessGroup:_processGroup browsingContextGroup:_browsingContextGroup];60 controller = [[WK2BrowserWindowController alloc] initWithWindowNibName:@"BrowserWindow"]; 68 61 #endif 69 70 62 if (!controller) 71 63 return; … … 99 91 [controller applicationTerminating]; 100 92 } 101 102 #if WK_API_ENABLED103 [_processGroup release];104 _processGroup = nil;105 106 [_browsingContextGroup release];107 _browsingContextGroup = nil;108 #endif109 93 } 110 94 … … 141 125 } 142 126 143 #if WK_API_ENABLED144 127 NSOpenPanel *openPanel = [NSOpenPanel openPanel]; 145 128 [openPanel beginWithCompletionHandler:^(NSInteger result) { … … 148 131 149 132 // FIXME: add a way to open in WK1 also. 150 BrowserWindowController *newBrowserWindowController = [[WK2BrowserWindowController alloc] initWithProcessGroup:_processGroup browsingContextGroup:_browsingContextGroup]; 133 134 BrowserWindowController *newBrowserWindowController = [[WK2BrowserWindowController alloc] initWithWindowNibName:@"BrowserWindow"]; 151 135 [newBrowserWindowController.window makeKeyAndOrderFront:self]; 152 136 … … 154 138 [newBrowserWindowController loadURLString:[url absoluteString]]; 155 139 }]; 156 #endif // WK_API_ENABLED157 140 } 158 141 -
trunk/Tools/MiniBrowser/mac/WK2BrowserWindowController.h
r160275 r165749 29 29 30 30 @interface WK2BrowserWindowController : BrowserWindowController <BrowserController> 31 32 - (id)initWithProcessGroup:(WKProcessGroup *)processGroup browsingContextGroup:(WKBrowsingContextGroup *)browsingContextGroup;33 34 31 @end 35 32 -
trunk/Tools/MiniBrowser/mac/WK2BrowserWindowController.m
r164877 r165749 29 29 30 30 #import "AppDelegate.h" 31 #import <WebKit2/WKBrowsingContextControllerPrivate.h> 32 #import <WebKit2/WKBrowsingContextHistoryDelegate.h> 33 #import <WebKit2/WKBrowsingContextLoadDelegatePrivate.h> 34 #import <WebKit2/WKBrowsingContextPolicyDelegate.h> 35 #import <WebKit2/WKNavigationData.h> 36 #import <WebKit2/WKStringCF.h> 37 #import <WebKit2/WKURLCF.h> 38 #import <WebKit2/WKView.h> 39 #import <WebKit2/WKViewPrivate.h> 31 #import <WebKit2/WKFrameInfo.h> 32 #import <WebKit2/WKWebView.h> 33 #import <WebKit2/WKNavigationDelegate.h> 34 #import <WebKit2/WKUIDelegate.h> 40 35 41 36 static void* keyValueObservingContext = &keyValueObservingContext; 42 37 static NSString * const WebKit2UseRemoteLayerTreeDrawingAreaKey = @"WebKit2UseRemoteLayerTreeDrawingArea"; 43 38 44 @interface WK2BrowserWindowController () <WK BrowsingContextLoadDelegatePrivate, WKBrowsingContextPolicyDelegate, WKBrowsingContextHistoryDelegate>39 @interface WK2BrowserWindowController () <WKNavigationDelegate, WKUIDelegate> 45 40 @end 46 41 47 42 @implementation WK2BrowserWindowController { 48 WKProcessGroup *_processGroup; 49 WKBrowsingContextGroup *_browsingContextGroup; 50 51 WKView *_webView; 52 } 53 54 - (id)initWithProcessGroup:(WKProcessGroup *)processGroup browsingContextGroup:(WKBrowsingContextGroup *)browsingContextGroup 55 { 56 if ((self = [super initWithWindowNibName:@"BrowserWindow"])) { 57 _processGroup = [processGroup retain]; 58 _browsingContextGroup = [browsingContextGroup retain]; 59 _zoomTextOnly = NO; 60 } 61 62 return self; 43 WKWebView *_webView; 44 } 45 46 - (void)awakeFromNib 47 { 48 _webView = [[WKWebView alloc] initWithFrame:[containerView bounds]]; 49 50 _webView.allowsMagnification = YES; 51 _webView.allowsBackForwardNavigationGestures = YES; 52 53 [_webView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; 54 [containerView addSubview:_webView]; 55 56 [progressIndicator bind:NSHiddenBinding toObject:_webView withKeyPath:@"loading" options:@{ NSValueTransformerNameBindingOption : NSNegateBooleanTransformerName }]; 57 [progressIndicator bind:NSValueBinding toObject:_webView withKeyPath:@"estimatedProgress" options:nil]; 58 59 [_webView addObserver:self forKeyPath:@"title" options:0 context:keyValueObservingContext]; 60 [_webView addObserver:self forKeyPath:@"activeURL" options:0 context:keyValueObservingContext]; 61 62 _webView.navigationDelegate = self; 63 _webView.UIDelegate = self; 63 64 } 64 65 65 66 - (void)dealloc 66 67 { 68 [_webView removeObserver:self forKeyPath:@"title"]; 69 [_webView removeObserver:self forKeyPath:@"activeURL"]; 70 67 71 [progressIndicator unbind:NSHiddenBinding]; 68 72 [progressIndicator unbind:NSValueBinding]; 69 73 70 [_webView.browsingContextController removeObserver:self forKeyPath:@"title" context:keyValueObservingContext];71 [_webView.browsingContextController removeObserver:self forKeyPath:@"activeURL" context:keyValueObservingContext];72 _webView.browsingContextController.loadDelegate = nil;73 _webView.browsingContextController.policyDelegate = nil;74 74 [_webView release]; 75 75 76 [_browsingContextGroup release];77 [_processGroup release];78 79 76 [super dealloc]; 80 77 } … … 84 81 [urlText setStringValue:[self addProtocolIfNecessary:[urlText stringValue]]]; 85 82 86 [_webView .browsingContextControllerloadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[urlText stringValue]]]];83 [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[urlText stringValue]]]]; 87 84 } 88 85 … … 115 112 if (action == @selector(resetZoom:)) 116 113 return [self canResetZoom]; 117 114 115 // Disabled until missing WK2 functionality is exposed via API/SPI. 116 if (action == @selector(reload:) 117 || action == @selector(toggleZoomMode:) 118 || action == @selector(resetZoom:) 119 || action == @selector(dumpSourceToConsole:) 120 || action == @selector(find:) 121 || action == @selector(togglePaginationMode:) 122 || action == @selector(toggleTransparentWindow:)) 123 return NO; 124 118 125 if (action == @selector(showHideWebView:)) 119 126 [menuItem setTitle:[_webView isHidden] ? @"Show Web View" : @"Hide Web View"]; 120 127 else if (action == @selector(removeReinsertWebView:)) 121 128 [menuItem setTitle:[_webView window] ? @"Remove Web View" : @"Insert Web View"]; 122 else if (action == @selector(toggleZoomMode:))123 [menuItem setState:_zoomTextOnly ? NSOnState : NSOffState];124 else if ([menuItem action] == @selector(togglePaginationMode:))125 [menuItem setState:[self isPaginated] ? NSOnState : NSOffState];126 else if ([menuItem action] == @selector(toggleTransparentWindow:))127 [menuItem setState:[[self window] isOpaque] ? NSOffState : NSOnState];128 129 else if ([menuItem action] == @selector(toggleUISideCompositing:)) 129 130 [menuItem setState:[self isUISideCompositingEnabled] ? NSOnState : NSOffState]; … … 134 135 - (IBAction)reload:(id)sender 135 136 { 136 [_webView.browsingContextController reload];137 137 } 138 138 … … 144 144 - (IBAction)goBack:(id)sender 145 145 { 146 [_webView .browsingContextControllergoBack];146 [_webView goBack]; 147 147 } 148 148 149 149 - (IBAction)goForward:(id)sender 150 150 { 151 [_webView.browsingContextController goForward]; 151 [_webView goForward]; 152 } 153 154 - (IBAction)toggleZoomMode:(id)sender 155 { 156 } 157 158 - (IBAction)resetZoom:(id)sender 159 { 160 } 161 162 - (BOOL)canResetZoom 163 { 164 return NO; 165 } 166 167 - (IBAction)dumpSourceToConsole:(id)sender 168 { 169 } 170 171 - (IBAction)togglePaginationMode:(id)sender 172 { 152 173 } 153 174 … … 157 178 158 179 if (action == @selector(goBack:)) 159 return _webView && [_webView .browsingContextControllercanGoBack];180 return _webView && [_webView canGoBack]; 160 181 161 182 if (action == @selector(goForward:)) 162 return _webView && [_webView .browsingContextControllercanGoForward];183 return _webView && [_webView canGoForward]; 163 184 164 185 return YES; … … 172 193 - (BOOL)windowShouldClose:(id)sender 173 194 { 174 LOG(@"windowShouldClose"); 175 BOOL canCloseImmediately = WKPageTryClose(_webView.pageRef); 176 return canCloseImmediately; 195 return YES; 177 196 } 178 197 … … 185 204 - (void)applicationTerminating 186 205 { 187 // FIXME: Why are we bothering to close the page? This doesn't even prevent LEAK output.188 WKPageClose(_webView.pageRef);189 206 } 190 207 … … 195 212 - (CGFloat)currentZoomFactor 196 213 { 197 return _zoomTextOnly ? _webView.browsingContextController.textZoom : _webView.browsingContextController.pageZoom;214 return 1; 198 215 } 199 216 200 217 - (void)setCurrentZoomFactor:(CGFloat)factor 201 218 { 202 if (_zoomTextOnly)203 _webView.browsingContextController.textZoom = factor;204 else205 _webView.browsingContextController.pageZoom = factor;206 219 } 207 220 208 221 - (BOOL)canZoomIn 209 222 { 210 return [self currentZoomFactor] * DefaultZoomFactorRatio < DefaultMaximumZoomFactor;223 return NO; 211 224 } 212 225 … … 222 235 - (BOOL)canZoomOut 223 236 { 224 return [self currentZoomFactor] / DefaultZoomFactorRatio > DefaultMinimumZoomFactor;237 return NO; 225 238 } 226 239 … … 234 247 } 235 248 236 - (BOOL)canResetZoom237 {238 return _zoomTextOnly ? (_webView.browsingContextController.textZoom != 1) : (_webView.browsingContextController.pageZoom != 1);239 }240 241 - (void)resetZoom:(id)sender242 {243 if (![self canResetZoom])244 return;245 246 if (_zoomTextOnly)247 _webView.browsingContextController.textZoom = 1;248 else249 _webView.browsingContextController.pageZoom = 1;250 }251 252 - (IBAction)toggleZoomMode:(id)sender253 {254 if (_zoomTextOnly) {255 _zoomTextOnly = NO;256 double currentTextZoom = _webView.browsingContextController.textZoom;257 WKPageSetPageAndTextZoomFactors(_webView.pageRef, currentTextZoom, 1);258 } else {259 _zoomTextOnly = YES;260 double currentPageZoom = _webView.browsingContextController.pageZoom;261 WKPageSetPageAndTextZoomFactors(_webView.pageRef, 1, currentPageZoom);262 }263 }264 265 - (BOOL)isPaginated266 {267 return _webView.browsingContextController.paginationMode != WKPaginationModeUnpaginated;268 }269 270 - (IBAction)togglePaginationMode:(id)sender271 {272 if ([self isPaginated])273 _webView.browsingContextController.paginationMode = WKPaginationModeUnpaginated;274 else {275 _webView.browsingContextController.paginationMode = WKPaginationModeLeftToRight;276 _webView.browsingContextController.pageLength = _webView.bounds.size.width / 2;277 _webView.browsingContextController.gapBetweenPages = 10;278 }279 }280 281 249 - (IBAction)toggleTransparentWindow:(id)sender 282 250 { 283 BOOL isTransparent = _webView.drawsTransparentBackground;284 isTransparent = !isTransparent;285 286 [[self window] setOpaque:!isTransparent];287 [[self window] setHasShadow:!isTransparent];288 289 _webView.drawsTransparentBackground = isTransparent;290 291 [[self window] display];292 251 } 293 252 … … 304 263 } 305 264 306 static void dumpSource(WKStringRef source, WKErrorRef error, void* context) 307 { 308 if ( !source)265 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 266 { 267 if (context != keyValueObservingContext || object != _webView) 309 268 return; 310 269 311 LOG(@"Main frame source\n \"%@\"", CFBridgingRelease(WKStringCopyCFString(0, source)));312 }313 314 - (IBAction)dumpSourceToConsole:(id)sender315 {316 WKPageGetSourceForFrame(_webView.pageRef, WKPageGetMainFrame(_webView.pageRef), NULL, dumpSource);317 }318 319 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context320 {321 if (context != keyValueObservingContext || object != _webView.browsingContextController)322 return;323 324 270 if ([keyPath isEqualToString:@"title"]) 325 self.window.title = [_webView. browsingContextController.title stringByAppendingString:_webView.isUsingUISideCompositing ? @" [WK2 UI]" :@" [WK2]"];271 self.window.title = [_webView.title stringByAppendingString:@" [WK2]"]; 326 272 else if ([keyPath isEqualToString:@"activeURL"]) 327 [self updateTextFieldFromURL:_webView.browsingContextController.activeURL]; 328 } 329 330 // MARK: UI Client Callbacks 331 332 static WKPageRef createNewPage(WKPageRef page, WKURLRequestRef request, WKDictionaryRef features, WKEventModifiers modifiers, WKEventMouseButton button, const void* clientInfo) 333 { 334 LOG(@"createNewPage"); 335 WK2BrowserWindowController *originator = (WK2BrowserWindowController *)clientInfo; 336 WK2BrowserWindowController *controller = [[WK2BrowserWindowController alloc] initWithProcessGroup:originator->_processGroup browsingContextGroup:originator->_browsingContextGroup]; 337 [controller loadWindow]; 338 339 return WKRetain(controller->_webView.pageRef); 340 } 341 342 static void showPage(WKPageRef page, const void *clientInfo) 343 { 344 LOG(@"showPage"); 345 [[(BrowserWindowController *)clientInfo window] orderFront:nil]; 346 } 347 348 static void closePage(WKPageRef page, const void *clientInfo) 349 { 350 LOG(@"closePage"); 351 WKPageClose(page); 352 [[(BrowserWindowController *)clientInfo window] close]; 353 } 354 355 static void runJavaScriptAlert(WKPageRef page, WKStringRef message, WKFrameRef frame, const void* clientInfo) 273 [self updateTextFieldFromURL:_webView.activeURL]; 274 } 275 276 - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)())completionHandler 356 277 { 357 278 NSAlert* alert = [[NSAlert alloc] init]; 358 279 359 WKURLRef wkURL = WKFrameCopyURL(frame); 360 CFURLRef cfURL = WKURLCopyCFURL(0, wkURL); 361 WKRelease(wkURL); 362 363 [alert setMessageText:[NSString stringWithFormat:@"JavaScript alert dialog from %@.", [(NSURL *)cfURL absoluteString]]]; 364 CFRelease(cfURL); 365 366 CFStringRef cfMessage = WKStringCopyCFString(0, message); 367 [alert setInformativeText:(NSString *)cfMessage]; 368 CFRelease(cfMessage); 369 280 [alert setMessageText:[NSString stringWithFormat:@"JavaScript alert dialog from %@.", [frame.request.URL absoluteString]]]; 281 [alert setInformativeText:message]; 370 282 [alert addButtonWithTitle:@"OK"]; 371 283 372 [alert runModal]; 373 [alert release]; 374 } 375 376 static bool runJavaScriptConfirm(WKPageRef page, WKStringRef message, WKFrameRef frame, const void* clientInfo) 284 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090 285 [alert beginSheetModalForWindow:self.window completionHandler:^void (NSModalResponse response) { 286 completionHandler(); 287 [alert release]; 288 }]; 289 #endif 290 } 291 292 - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler 377 293 { 378 294 NSAlert* alert = [[NSAlert alloc] init]; 379 295 380 WKURLRef wkURL = WKFrameCopyURL(frame); 381 CFURLRef cfURL = WKURLCopyCFURL(0, wkURL); 382 WKRelease(wkURL); 383 384 [alert setMessageText:[NSString stringWithFormat:@"JavaScript confirm dialog from %@.", [(NSURL *)cfURL absoluteString]]]; 385 CFRelease(cfURL); 386 387 CFStringRef cfMessage = WKStringCopyCFString(0, message); 388 [alert setInformativeText:(NSString *)cfMessage]; 389 CFRelease(cfMessage); 390 296 [alert setMessageText:[NSString stringWithFormat:@"JavaScript confirm dialog from %@.", [frame.request.URL absoluteString]]]; 297 [alert setInformativeText:message]; 298 391 299 [alert addButtonWithTitle:@"OK"]; 392 300 [alert addButtonWithTitle:@"Cancel"]; 393 301 394 NSInteger button = [alert runModal]; 395 [alert release]; 396 397 return button == NSAlertFirstButtonReturn; 398 } 399 400 static WKStringRef runJavaScriptPrompt(WKPageRef page, WKStringRef message, WKStringRef defaultValue, WKFrameRef frame, const void* clientInfo) 302 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090 303 [alert beginSheetModalForWindow:self.window completionHandler:^void (NSModalResponse response) { 304 completionHandler(response == NSAlertFirstButtonReturn); 305 [alert release]; 306 }]; 307 #endif 308 } 309 310 - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString *result))completionHandler 401 311 { 402 312 NSAlert* alert = [[NSAlert alloc] init]; 403 313 404 WKURLRef wkURL = WKFrameCopyURL(frame); 405 CFURLRef cfURL = WKURLCopyCFURL(0, wkURL); 406 WKRelease(wkURL); 407 408 [alert setMessageText:[NSString stringWithFormat:@"JavaScript prompt dialog from %@.", [(NSURL *)cfURL absoluteString]]]; 409 CFRelease(cfURL); 410 411 CFStringRef cfMessage = WKStringCopyCFString(0, message); 412 [alert setInformativeText:(NSString *)cfMessage]; 413 CFRelease(cfMessage); 414 314 [alert setMessageText:[NSString stringWithFormat:@"JavaScript prompt dialog from %@.", [frame.request.URL absoluteString]]]; 315 [alert setInformativeText:prompt]; 316 415 317 [alert addButtonWithTitle:@"OK"]; 416 318 [alert addButtonWithTitle:@"Cancel"]; 417 319 418 320 NSTextField* input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 24)]; 419 CFStringRef cfDefaultValue = WKStringCopyCFString(0, defaultValue); 420 [input setStringValue:(NSString *)cfDefaultValue]; 421 CFRelease(cfDefaultValue); 422 321 [input setStringValue:defaultText]; 423 322 [alert setAccessoryView:input]; 424 425 NSInteger button = [alert runModal]; 426 427 NSString* result = nil; 428 if (button == NSAlertFirstButtonReturn) { 323 324 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090 325 [alert beginSheetModalForWindow:self.window completionHandler:^void (NSModalResponse response) { 429 326 [input validateEditing]; 430 result = [input stringValue]; 431 } 432 433 [alert release]; 434 435 if (!result) 436 return 0; 437 return WKStringCreateWithCFString((CFStringRef)result); 438 } 439 440 static void setStatusText(WKPageRef page, WKStringRef text, const void* clientInfo) 441 { 442 LOG(@"setStatusText"); 443 } 444 445 static void mouseDidMoveOverElement(WKPageRef page, WKHitTestResultRef hitTestResult, WKEventModifiers modifiers, WKTypeRef userData, const void *clientInfo) 446 { 447 LOG(@"mouseDidMoveOverElement"); 448 } 449 450 static WKRect getWindowFrame(WKPageRef page, const void* clientInfo) 451 { 452 NSRect rect = [[(BrowserWindowController *)clientInfo window] frame]; 453 WKRect wkRect; 454 wkRect.origin.x = rect.origin.x; 455 wkRect.origin.y = rect.origin.y; 456 wkRect.size.width = rect.size.width; 457 wkRect.size.height = rect.size.height; 458 return wkRect; 459 } 460 461 static void setWindowFrame(WKPageRef page, WKRect rect, const void* clientInfo) 462 { 463 [[(BrowserWindowController *)clientInfo window] setFrame:NSMakeRect(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height) display:YES]; 464 } 465 466 static bool runBeforeUnloadConfirmPanel(WKPageRef page, WKStringRef message, WKFrameRef frame, const void* clientInfo) 467 { 468 NSAlert *alert = [[NSAlert alloc] init]; 469 470 WKURLRef wkURL = WKFrameCopyURL(frame); 471 CFURLRef cfURL = WKURLCopyCFURL(0, wkURL); 472 WKRelease(wkURL); 473 474 [alert setMessageText:[NSString stringWithFormat:@"BeforeUnload confirm dialog from %@.", [(NSURL *)cfURL absoluteString]]]; 475 CFRelease(cfURL); 476 477 CFStringRef cfMessage = WKStringCopyCFString(0, message); 478 [alert setInformativeText:(NSString *)cfMessage]; 479 CFRelease(cfMessage); 480 481 [alert addButtonWithTitle:@"OK"]; 482 [alert addButtonWithTitle:@"Cancel"]; 483 484 NSInteger button = [alert runModal]; 485 [alert release]; 486 487 return button == NSAlertFirstButtonReturn; 488 } 489 490 static void runOpenPanel(WKPageRef page, WKFrameRef frame, WKOpenPanelParametersRef parameters, WKOpenPanelResultListenerRef listener, const void* clientInfo) 491 { 492 NSOpenPanel *openPanel = [NSOpenPanel openPanel]; 493 [openPanel setAllowsMultipleSelection:WKOpenPanelParametersGetAllowsMultipleFiles(parameters)]; 494 495 WKRetain(listener); 496 497 [openPanel beginSheetModalForWindow:[(BrowserWindowController *)clientInfo window] completionHandler:^(NSInteger result) { 498 if (result == NSFileHandlingPanelOKButton) { 499 WKMutableArrayRef fileURLs = WKMutableArrayCreate(); 500 501 NSURL *nsURL; 502 for (nsURL in [openPanel URLs]) { 503 WKURLRef wkURL = WKURLCreateWithCFURL((CFURLRef)nsURL); 504 WKArrayAppendItem(fileURLs, wkURL); 505 WKRelease(wkURL); 506 } 507 508 WKOpenPanelResultListenerChooseFiles(listener, fileURLs); 509 510 WKRelease(fileURLs); 511 } else 512 WKOpenPanelResultListenerCancel(listener); 513 514 WKRelease(listener); 327 completionHandler(response == NSAlertFirstButtonReturn ? [input stringValue] : nil); 328 [alert release]; 515 329 }]; 516 } 517 518 - (void)awakeFromNib 519 { 520 _webView = [[WKView alloc] initWithFrame:[containerView bounds] processGroup:_processGroup browsingContextGroup:_browsingContextGroup]; 521 522 _webView.allowsMagnification = YES; 523 _webView.allowsBackForwardNavigationGestures = YES; 524 525 [_webView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; 526 [containerView addSubview:_webView]; 527 528 [progressIndicator bind:NSHiddenBinding toObject:_webView.browsingContextController withKeyPath:@"loading" options:@{ NSValueTransformerNameBindingOption : NSNegateBooleanTransformerName }]; 529 [progressIndicator bind:NSValueBinding toObject:_webView.browsingContextController withKeyPath:@"estimatedProgress" options:nil]; 530 531 [_webView.browsingContextController addObserver:self forKeyPath:@"title" options:0 context:keyValueObservingContext]; 532 [_webView.browsingContextController addObserver:self forKeyPath:@"activeURL" options:0 context:keyValueObservingContext]; 533 534 _webView.browsingContextController.loadDelegate = self; 535 _webView.browsingContextController.policyDelegate = self; 536 _webView.browsingContextController.historyDelegate = self; 537 538 WKPageUIClientV2 uiClient = { 539 { 2, self }, 540 0, /* createNewPage_deprecatedForUseWithV0 */ 541 showPage, 542 closePage, 543 0, /* takeFocus */ 544 0, /* focus */ 545 0, /* unfocus */ 546 runJavaScriptAlert, 547 runJavaScriptConfirm, 548 runJavaScriptPrompt, 549 setStatusText, 550 0, /* mouseDidMoveOverElement_deprecatedForUseWithV0 */ 551 0, /* missingPluginButtonClicked */ 552 0, /* didNotHandleKeyEvent */ 553 0, /* didNotHandleWheelEvent */ 554 0, /* toolbarsAreVisible */ 555 0, /* setToolbarsAreVisible */ 556 0, /* menuBarIsVisible */ 557 0, /* setMenuBarIsVisible */ 558 0, /* statusBarIsVisible */ 559 0, /* setStatusBarIsVisible */ 560 0, /* isResizable */ 561 0, /* setIsResizable */ 562 getWindowFrame, 563 setWindowFrame, 564 runBeforeUnloadConfirmPanel, 565 0, /* didDraw */ 566 0, /* pageDidScroll */ 567 0, /* exceededDatabaseQuota */ 568 runOpenPanel, 569 0, /* decidePolicyForGeolocationPermissionRequest */ 570 0, // headerHeight 571 0, // footerHeight 572 0, // drawHeader 573 0, // drawFooter 574 0, // printFrame 575 0, // showModal 576 0, // didCompleteRubberBandForMainFrame 577 0, // saveDataToFileInDownloadsFolder 578 0, // shouldInterruptJavaScript 579 createNewPage, 580 mouseDidMoveOverElement, 581 0, // decidePolicyForNotificationPermissionRequest 582 0, // unavailablePluginButtonClicked_deprecatedForUseWithV1 583 0, // showColorPicker 584 0, // hideColorPicker 585 0, // unavailablePluginButtonClicked 586 }; 587 WKPageSetPageUIClient(_webView.pageRef, &uiClient.base); 330 #endif 588 331 } 589 332 … … 613 356 - (IBAction)find:(id)sender 614 357 { 615 WKStringRef string = WKStringCreateWithCFString((CFStringRef)[sender stringValue]); 616 617 WKPageFindString(_webView.pageRef, string, kWKFindOptionsCaseInsensitive | kWKFindOptionsWrapAround | kWKFindOptionsShowFindIndicator | kWKFindOptionsShowOverlay, 100); 618 } 619 620 #pragma mark WKBrowsingContextLoadDelegate 621 622 - (void)browsingContextControllerDidStartProvisionalLoad:(WKBrowsingContextController *)sender 623 { 624 LOG(@"didStartProvisionalLoad"); 625 } 626 627 - (void)browsingContextControllerDidReceiveServerRedirectForProvisionalLoad:(WKBrowsingContextController *)sender 628 { 629 LOG(@"didReceiveServerRedirectForProvisionalLoad"); 630 } 631 632 - (void)browsingContextController:(WKBrowsingContextController *)sender didFailProvisionalLoadWithError:(NSError *)error 633 { 634 LOG(@"didFailProvisionalLoadWithError: %@", error); 635 } 636 637 - (void)browsingContextControllerDidCommitLoad:(WKBrowsingContextController *)sender 638 { 639 LOG(@"didCommitLoad"); 640 } 641 642 - (void)browsingContextControllerDidFinishLoad:(WKBrowsingContextController *)sender 643 { 644 LOG(@"didFinishLoad"); 645 } 646 647 - (void)browsingContextController:(WKBrowsingContextController *)sender didFailLoadWithError:(NSError *)error 648 { 649 LOG(@"didFailLoadWithError: %@", error); 650 } 651 652 - (void)browsingContextControllerDidChangeBackForwardList:(WKBrowsingContextController *)sender addedItem:(WKBackForwardListItem *)addedItem removedItems:(NSArray *)removedItems 653 { 654 [self validateToolbar]; 655 } 656 657 #pragma mark WKBrowsingContextLoadDelegatePrivate 658 659 - (BOOL)browsingContextController:(WKBrowsingContextController *)sender canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 660 { 661 LOG(@"canAuthenticateAgainstProtectionSpace: %@", protectionSpace); 662 return YES; 663 } 664 665 - (void)browsingContextController:(WKBrowsingContextController *)sender didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 666 { 667 LOG(@"didReceiveAuthenticationChallenge: %@", challenge); 668 [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; 669 } 670 671 #pragma mark WKBrowsingContextPolicyDelegate 672 673 - (void)browsingContextController:(WKBrowsingContextController *)browsingContext decidePolicyForNavigationAction:(NSDictionary *)actionInformation decisionHandler:(WKPolicyDecisionHandler)decisionHandler 674 { 675 LOG(@"decidePolicyForNavigationAction"); 676 decisionHandler(WKPolicyDecisionAllow); 677 } 678 679 - (void)browsingContextController:(WKBrowsingContextController *)browsingContext decidePolicyForNewWindowAction:(NSDictionary *)actionInformation decisionHandler:(WKPolicyDecisionHandler)decisionHandler 680 { 681 LOG(@"decidePolicyForNewWindowAction"); 682 decisionHandler(WKPolicyDecisionAllow); 683 } 684 685 - (void)browsingContextController:(WKBrowsingContextController *)browsingContext decidePolicyForResponseAction:(NSDictionary *)actionInformation decisionHandler:(WKPolicyDecisionHandler)decisionHandler 686 { 687 decisionHandler(WKPolicyDecisionAllow); 688 } 689 690 #pragma mark WKBrowsingContextHistoryDelegate 691 692 - (void)browsingContextController:(WKBrowsingContextController *)browsingContextController didNavigateWithNavigationData:(WKNavigationData *)navigationData 693 { 694 LOG(@"WKBrowsingContextHistoryDelegate - didNavigateWithNavigationData - title: %@ - url: %@", navigationData.title, navigationData.originalRequest.URL); 695 } 696 697 - (void)browsingContextController:(WKBrowsingContextController *)browsingContextController didPerformClientRedirectFromURL:(NSURL *)sourceURL toURL:(NSURL *)destinationURL 698 { 699 LOG(@"WKBrowsingContextHistoryDelegate - didPerformClientRedirect - fromURL: %@ - toURL: %@", sourceURL, destinationURL); 700 } 701 702 - (void)browsingContextController:(WKBrowsingContextController *)browsingContextController didPerformServerRedirectFromURL:(NSURL *)sourceURL toURL:(NSURL *)destinationURL 703 { 704 LOG(@"WKBrowsingContextHistoryDelegate - didPerformServerRedirect - fromURL: %@ - toURL: %@", sourceURL, destinationURL); 705 } 706 707 - (void)browsingContextController:(WKBrowsingContextController *)browsingContextController didUpdateHistoryTitle:(NSString *)title forURL:(NSURL *)URL 708 { 709 LOG(@"browsingContextController - didUpdateHistoryTitle - title: %@ - URL: %@", title, URL); 358 } 359 360 #pragma mark WKNavigationDelegate 361 362 - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicyDecision))decisionHandler 363 { 364 LOG(@"decidePolicyForNavigationResponse"); 365 decisionHandler(WKNavigationResponsePolicyDecisionAllow); 366 } 367 368 - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation 369 { 370 LOG(@"didStartProvisionalNavigation"); 371 } 372 373 - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation 374 { 375 LOG(@"didReceiveServerRedirectForProvisionalNavigation"); 376 } 377 378 - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error 379 { 380 LOG(@"didFailProvisionalNavigation: %@", error); 381 } 382 383 - (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation 384 { 385 LOG(@"didCommitNavigation: %@", error); 386 } 387 388 - (void)webView:(WKWebView *)webView didFinishLoadingNavigation:(WKNavigation *)navigation 389 { 390 LOG(@"didFinishLoadingNavigation"); 391 } 392 393 - (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error 394 { 395 LOG(@"didFailNavigation: %@", error); 710 396 } 711 397
Note: See TracChangeset
for help on using the changeset viewer.