Changeset 165749 in webkit


Ignore:
Timestamp:
Mar 17, 2014 1:10:12 PM (10 years ago)
Author:
Simon Fraser
Message:

Convert MiniBrowser to use WKWebView API
https://bugs.webkit.org/show_bug.cgi?id=130061

Reviewed by Anders Carlsson.

Convert the MiniBrowser WK2 window to use WebKit2 API as much
as possible.

Some functionality was removed temporarily:

  • text zoom, page zoom
  • reload
  • pagination mode
  • transparent window
  • dumping source
  • window.open support
  • beforeUnload panel
  • find in page
  • MiniBrowser/mac/AppDelegate.h:
  • MiniBrowser/mac/AppDelegate.m:

(-[BrowserAppDelegate init]):
(-[BrowserAppDelegate newWindow:]):
(-[BrowserAppDelegate applicationWillTerminate:]):
(-[BrowserAppDelegate openDocument:]):

  • MiniBrowser/mac/WK2BrowserWindowController.h:
  • MiniBrowser/mac/WK2BrowserWindowController.m:

(-[WK2BrowserWindowController awakeFromNib]):
(-[WK2BrowserWindowController dealloc]):
(-[WK2BrowserWindowController fetch:]):
(-[WK2BrowserWindowController validateMenuItem:]):
(-[WK2BrowserWindowController reload:]):
(-[WK2BrowserWindowController goBack:]):
(-[WK2BrowserWindowController goForward:]):
(-[WK2BrowserWindowController toggleZoomMode:]):
(-[WK2BrowserWindowController resetZoom:]):
(-[WK2BrowserWindowController canResetZoom]):
(-[WK2BrowserWindowController dumpSourceToConsole:]):
(-[WK2BrowserWindowController togglePaginationMode:]):
(-[WK2BrowserWindowController validateUserInterfaceItem:]):
(-[WK2BrowserWindowController windowShouldClose:]):
(-[WK2BrowserWindowController applicationTerminating]):
(-[WK2BrowserWindowController currentZoomFactor]):
(-[WK2BrowserWindowController setCurrentZoomFactor:]):
(-[WK2BrowserWindowController toggleTransparentWindow:]):
(-[WK2BrowserWindowController observeValueForKeyPath:ofObject:change:context:]):
(-[WK2BrowserWindowController webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
(-[WK2BrowserWindowController webView:runJavaScriptConfirmPanelWithMessage:initiatedByFrame:completionHandler:]):
(-[WK2BrowserWindowController webView:runJavaScriptTextInputPanelWithPrompt:defaultText:initiatedByFrame:completionHandler:]):
(-[WK2BrowserWindowController find:]):
(-[WK2BrowserWindowController webView:decidePolicyForNavigationResponse:decisionHandler:]):
(-[WK2BrowserWindowController webView:didStartProvisionalNavigation:]):
(-[WK2BrowserWindowController webView:didReceiveServerRedirectForProvisionalNavigation:]):
(-[WK2BrowserWindowController webView:didFailProvisionalNavigation:withError:]):
(-[WK2BrowserWindowController webView:didCommitNavigation:]):
(-[WK2BrowserWindowController webView:didFinishLoadingNavigation:]):
(-[WK2BrowserWindowController webView:didFailNavigation:withError:]):

  • WebKitTestRunner/PlatformWebView.h:
  • WebKitTestRunner/ios/PlatformWebViewIOS.mm:
  • WebKitTestRunner/mac/PlatformWebViewMac.mm:
Location:
trunk/Tools
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r165746 r165749  
     12014-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
    1632014-03-17  Zan Dobersek  <zdobersek@igalia.com>
    264
  • trunk/Tools/MiniBrowser/mac/AppDelegate.h

    r160298 r165749  
    2424 */
    2525
    26 #import <WebKit2/WebKit2.h>
    27 
    2826@interface BrowserAppDelegate : NSObject <NSApplicationDelegate> {
    29 #if WK_API_ENABLED
    30     WKProcessGroup *_processGroup;
    31     WKBrowsingContextGroup *_browsingContextGroup;
    32 #endif
    3327    NSMutableSet *_browserWindows;
    3428}
  • trunk/Tools/MiniBrowser/mac/AppDelegate.m

    r164624 r165749  
    3030#import <WebKit/WebHistory.h>
    3131#import <WebKit2/WebKit2.h>
    32 #import <WebKit2/WKStringCF.h>
    33 #import <WebKit2/WKURLCF.h>
    3432
    3533static NSString *defaultURL = @"http://www.webkit.org/";
     
    4644    self = [super init];
    4745    if (self) {
    48 #if WK_API_ENABLED
    49         NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForAuxiliaryExecutable:@"MiniBrowser.wkbundle"]];
    50         _processGroup = [[WKProcessGroup alloc] initWithInjectedBundleURL:url];
    51         _browsingContextGroup = [[WKBrowsingContextGroup alloc] initWithIdentifier:@"MiniBrowser"];
    52 #endif
    5346        _browserWindows = [[NSMutableSet alloc] init];
    5447    }
     
    6558#if WK_API_ENABLED
    6659    else if ([sender tag] == WebKit2NewWindowTag)
    67         controller = [[WK2BrowserWindowController alloc] initWithProcessGroup:_processGroup browsingContextGroup:_browsingContextGroup];
     60        controller = [[WK2BrowserWindowController alloc] initWithWindowNibName:@"BrowserWindow"];
    6861#endif
    69 
    7062    if (!controller)
    7163        return;
     
    9991        [controller applicationTerminating];
    10092    }
    101 
    102 #if WK_API_ENABLED
    103     [_processGroup release];
    104     _processGroup = nil;
    105 
    106     [_browsingContextGroup release];
    107     _browsingContextGroup = nil;
    108 #endif
    10993}
    11094
     
    141125    }
    142126
    143 #if WK_API_ENABLED
    144127    NSOpenPanel *openPanel = [NSOpenPanel openPanel];
    145128    [openPanel beginWithCompletionHandler:^(NSInteger result) {
     
    148131
    149132        // 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"];
    151135        [newBrowserWindowController.window makeKeyAndOrderFront:self];
    152136
     
    154138        [newBrowserWindowController loadURLString:[url absoluteString]];
    155139    }];
    156 #endif // WK_API_ENABLED
    157140}
    158141
  • trunk/Tools/MiniBrowser/mac/WK2BrowserWindowController.h

    r160275 r165749  
    2929
    3030@interface WK2BrowserWindowController : BrowserWindowController <BrowserController>
    31 
    32 - (id)initWithProcessGroup:(WKProcessGroup *)processGroup browsingContextGroup:(WKBrowsingContextGroup *)browsingContextGroup;
    33 
    3431@end
    3532
  • trunk/Tools/MiniBrowser/mac/WK2BrowserWindowController.m

    r164877 r165749  
    2929
    3030#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>
    4035
    4136static void* keyValueObservingContext = &keyValueObservingContext;
    4237static NSString * const WebKit2UseRemoteLayerTreeDrawingAreaKey = @"WebKit2UseRemoteLayerTreeDrawingArea";
    4338
    44 @interface WK2BrowserWindowController () <WKBrowsingContextLoadDelegatePrivate, WKBrowsingContextPolicyDelegate, WKBrowsingContextHistoryDelegate>
     39@interface WK2BrowserWindowController () <WKNavigationDelegate, WKUIDelegate>
    4540@end
    4641
    4742@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;
    6364}
    6465
    6566- (void)dealloc
    6667{
     68    [_webView removeObserver:self forKeyPath:@"title"];
     69    [_webView removeObserver:self forKeyPath:@"activeURL"];
     70   
    6771    [progressIndicator unbind:NSHiddenBinding];
    6872    [progressIndicator unbind:NSValueBinding];
    6973
    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;
    7474    [_webView release];
    7575
    76     [_browsingContextGroup release];
    77     [_processGroup release];
    78 
    7976    [super dealloc];
    8077}
     
    8481    [urlText setStringValue:[self addProtocolIfNecessary:[urlText stringValue]]];
    8582
    86     [_webView.browsingContextController loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[urlText stringValue]]]];
     83    [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[urlText stringValue]]]];
    8784}
    8885
     
    115112    if (action == @selector(resetZoom:))
    116113        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   
    118125    if (action == @selector(showHideWebView:))
    119126        [menuItem setTitle:[_webView isHidden] ? @"Show Web View" : @"Hide Web View"];
    120127    else if (action == @selector(removeReinsertWebView:))
    121128        [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];
    128129    else if ([menuItem action] == @selector(toggleUISideCompositing:))
    129130        [menuItem setState:[self isUISideCompositingEnabled] ? NSOnState : NSOffState];
     
    134135- (IBAction)reload:(id)sender
    135136{
    136     [_webView.browsingContextController reload];
    137137}
    138138
     
    144144- (IBAction)goBack:(id)sender
    145145{
    146     [_webView.browsingContextController goBack];
     146    [_webView goBack];
    147147}
    148148
    149149- (IBAction)goForward:(id)sender
    150150{
    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{
    152173}
    153174
     
    157178
    158179    if (action == @selector(goBack:))
    159         return _webView && [_webView.browsingContextController canGoBack];
     180        return _webView && [_webView canGoBack];
    160181   
    161182    if (action == @selector(goForward:))
    162         return _webView && [_webView.browsingContextController canGoForward];
     183        return _webView && [_webView canGoForward];
    163184   
    164185    return YES;
     
    172193- (BOOL)windowShouldClose:(id)sender
    173194{
    174     LOG(@"windowShouldClose");
    175     BOOL canCloseImmediately = WKPageTryClose(_webView.pageRef);
    176     return canCloseImmediately;
     195    return YES;
    177196}
    178197
     
    185204- (void)applicationTerminating
    186205{
    187     // FIXME: Why are we bothering to close the page? This doesn't even prevent LEAK output.
    188     WKPageClose(_webView.pageRef);
    189206}
    190207
     
    195212- (CGFloat)currentZoomFactor
    196213{
    197     return _zoomTextOnly ? _webView.browsingContextController.textZoom : _webView.browsingContextController.pageZoom;
     214    return 1;
    198215}
    199216
    200217- (void)setCurrentZoomFactor:(CGFloat)factor
    201218{
    202     if (_zoomTextOnly)
    203         _webView.browsingContextController.textZoom = factor;
    204     else
    205         _webView.browsingContextController.pageZoom = factor;
    206219}
    207220
    208221- (BOOL)canZoomIn
    209222{
    210     return [self currentZoomFactor] * DefaultZoomFactorRatio < DefaultMaximumZoomFactor;
     223    return NO;
    211224}
    212225
     
    222235- (BOOL)canZoomOut
    223236{
    224     return [self currentZoomFactor] / DefaultZoomFactorRatio > DefaultMinimumZoomFactor;
     237    return NO;
    225238}
    226239
     
    234247}
    235248
    236 - (BOOL)canResetZoom
    237 {
    238     return _zoomTextOnly ? (_webView.browsingContextController.textZoom != 1) : (_webView.browsingContextController.pageZoom != 1);
    239 }
    240 
    241 - (void)resetZoom:(id)sender
    242 {
    243     if (![self canResetZoom])
    244         return;
    245 
    246     if (_zoomTextOnly)
    247         _webView.browsingContextController.textZoom = 1;
    248     else
    249         _webView.browsingContextController.pageZoom = 1;
    250 }
    251 
    252 - (IBAction)toggleZoomMode:(id)sender
    253 {
    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)isPaginated
    266 {
    267     return _webView.browsingContextController.paginationMode != WKPaginationModeUnpaginated;
    268 }
    269 
    270 - (IBAction)togglePaginationMode:(id)sender
    271 {
    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 
    281249- (IBAction)toggleTransparentWindow:(id)sender
    282250{
    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];   
    292251}
    293252
     
    304263}
    305264
    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)
    309268        return;
    310269
    311     LOG(@"Main frame source\n \"%@\"", CFBridgingRelease(WKStringCopyCFString(0, source)));
    312 }
    313 
    314 - (IBAction)dumpSourceToConsole:(id)sender
    315 {
    316     WKPageGetSourceForFrame(_webView.pageRef, WKPageGetMainFrame(_webView.pageRef), NULL, dumpSource);
    317 }
    318 
    319 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    320 {
    321     if (context != keyValueObservingContext || object != _webView.browsingContextController)
    322         return;
    323 
    324270    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]"];
    326272    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
    356277{
    357278    NSAlert* alert = [[NSAlert alloc] init];
    358279
    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];
    370282    [alert addButtonWithTitle:@"OK"];
    371283
    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
    377293{
    378294    NSAlert* alert = [[NSAlert alloc] init];
    379295
    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   
    391299    [alert addButtonWithTitle:@"OK"];
    392300    [alert addButtonWithTitle:@"Cancel"];
    393301
    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
    401311{
    402312    NSAlert* alert = [[NSAlert alloc] init];
    403313
    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   
    415317    [alert addButtonWithTitle:@"OK"];
    416318    [alert addButtonWithTitle:@"Cancel"];
    417 
     319   
    418320    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];
    423322    [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) {
    429326        [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];
    515329    }];
    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
    588331}
    589332
     
    613356- (IBAction)find:(id)sender
    614357{
    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);
    710396}
    711397
Note: See TracChangeset for help on using the changeset viewer.