WebKitTools/MiniBrowser/mac/AppDelegate.m
changeset 0 4f2f89ce4247
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebKitTools/MiniBrowser/mac/AppDelegate.m	Fri Sep 17 09:02:29 2010 +0300
@@ -0,0 +1,196 @@
+/*
+ * 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 "AppDelegate.h"
+
+#import "BrowserWindowController.h"
+#import "BrowserStatisticsWindowController.h"
+
+#import <WebKit2/WKStringCF.h>
+#import <WebKit2/WKContextPrivate.h>
+
+static NSString *defaultURL = @"http://www.webkit.org/";
+
+@implementation BrowserAppDelegate
+
+void _didRecieveMessageFromInjectedBundle(WKContextRef context, WKStringRef message, const void *clientInfo)
+{
+    CFStringRef cfMessage = WKStringCopyCFString(0, message);
+    LOG(@"ContextInjectedBundleClient - didRecieveMessage - message: %@", cfMessage);
+    CFRelease(cfMessage);
+
+    WKStringRef newMessage = WKStringCreateWithCFString(CFSTR("Roger that!"));
+    WKContextPostMessageToInjectedBundle(context, newMessage);
+    WKStringRelease(newMessage);
+}
+
+- (id)init
+{
+    self = [super init];
+    if (self) {
+        if ([NSEvent modifierFlags] & NSShiftKeyMask)
+            currentProcessModel = kProcessModelSharedSecondaryThread;
+        else
+            currentProcessModel = kProcessModelSharedSecondaryProcess;
+
+        WKContextRef threadContext = WKContextGetSharedThreadContext();
+        threadPageNamespace = WKPageNamespaceCreate(threadContext);
+        WKContextRelease(threadContext);
+
+        CFStringRef bundlePathCF = (CFStringRef)[[NSBundle mainBundle] pathForAuxiliaryExecutable:@"WebBundle.bundle"];
+        WKStringRef bundlePath = WKStringCreateWithCFString(bundlePathCF);
+
+        WKContextRef processContext = WKContextCreateWithInjectedBundlePath(bundlePath);
+        
+        WKContextInjectedBundleClient bundleClient = {
+            0,      /* version */
+            0,      /* clientInfo */
+            _didRecieveMessageFromInjectedBundle
+        };
+        WKContextSetInjectedBundleClient(processContext, &bundleClient);
+        
+        processPageNamespace = WKPageNamespaceCreate(processContext);
+        WKContextRelease(processContext);
+
+        WKStringRelease(bundlePath);
+    }
+
+    return self;
+}
+
+- (IBAction)newWindow:(id)sender
+{
+    BrowserWindowController *controller = [[BrowserWindowController alloc] initWithPageNamespace:[self getCurrentPageNamespace]];
+    [[controller window] makeKeyAndOrderFront:sender];
+    
+    [controller loadURLString:defaultURL];
+}
+
+- (WKPageNamespaceRef)getCurrentPageNamespace
+{
+    return (currentProcessModel == kProcessModelSharedSecondaryThread) ? threadPageNamespace : processPageNamespace;
+}
+
+- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
+{
+    if ([menuItem action] == @selector(setSharedProcessProcessModel:))
+        [menuItem setState:currentProcessModel == kProcessModelSharedSecondaryProcess ? NSOnState : NSOffState];
+    else if ([menuItem action] == @selector(setSharedThreadProcessModel:))
+        [menuItem setState:currentProcessModel == kProcessModelSharedSecondaryThread ? NSOnState : NSOffState];
+    return YES;
+}        
+
+- (void)_setProcessModel:(ProcessModel)processModel
+{
+    if (processModel == currentProcessModel)
+        return;
+ 
+    currentProcessModel = processModel;
+}
+
+- (IBAction)setSharedProcessProcessModel:(id)sender
+{
+    [self _setProcessModel:kProcessModelSharedSecondaryProcess];
+}
+
+- (IBAction)setSharedThreadProcessModel:(id)sender
+{
+    [self _setProcessModel:kProcessModelSharedSecondaryThread];
+}
+
+- (IBAction)showStatisticsWindow:(id)sender
+{
+    static BrowserStatisticsWindowController* windowController;
+    if (!windowController)
+        windowController = [[BrowserStatisticsWindowController alloc] initWithThreadedWKContextRef:WKPageNamespaceGetContext(threadPageNamespace) 
+                                                                               processWKContextRef:WKPageNamespaceGetContext(processPageNamespace)];
+
+    [[windowController window] makeKeyAndOrderFront:self];
+}
+
+- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
+{
+    [self newWindow:self];
+}
+
+- (void)applicationWillTerminate:(NSNotification *)notification
+{
+    NSArray* windows = [NSApp windows];
+    for (NSWindow* window in windows) {
+        id delegate = [window delegate];
+        if ([delegate isKindOfClass:[BrowserWindowController class]]) {
+            BrowserWindowController *controller = (BrowserWindowController *)delegate;
+            [controller applicationTerminating];
+        }
+    }
+    
+    WKPageNamespaceRelease(threadPageNamespace);
+    threadPageNamespace = 0;
+
+    WKPageNamespaceRelease(processPageNamespace);
+    processPageNamespace = 0;
+}
+
+- (BrowserWindowController *)frontmostBrowserWindowController
+{
+    NSArray* windows = [NSApp windows];
+    for (NSWindow* window in windows) {
+        id delegate = [window delegate];
+        if ([delegate isKindOfClass:[BrowserWindowController class]])
+            return (BrowserWindowController *)delegate;
+    }
+
+    return 0;
+}
+
+- (IBAction)openDocument:(id)sender
+{
+    NSOpenPanel *openPanel = [[NSOpenPanel openPanel] retain];
+    [openPanel beginForDirectory:nil
+        file:nil
+        types:nil
+        modelessDelegate:self
+        didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:)
+        contextInfo:0];
+}
+
+- (void)openPanelDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo
+{
+    [sheet autorelease];
+    if (returnCode != NSOKButton || ![[sheet filenames] count])
+        return;
+    
+    NSString* filePath = [[sheet filenames] objectAtIndex:0];
+
+    BrowserWindowController *controller = [self frontmostBrowserWindowController];
+    if (!controller) {
+        controller = [[BrowserWindowController alloc] initWithPageNamespace:[self getCurrentPageNamespace]];
+        [[controller window] makeKeyAndOrderFront:self];
+    }
+    
+    [controller loadURLString:[[NSURL fileURLWithPath:filePath] absoluteString]];
+}
+
+@end