1 /* 2 * Copyright (C) 2010 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include <Cocoa/Cocoa.h> 27 #include <WebKit2/WKBundle.h> 28 #include <WebKit2/WKBundleFrame.h> 29 #include <WebKit2/WKBundleInitialize.h> 30 #include <WebKit2/WKBundlePage.h> 31 #include <WebKit2/WKString.h> 32 #include <WebKit2/WKStringCF.h> 33 #include <WebKit2/WKURLCF.h> 34 #include <stdio.h> 35 36 static WKBundleRef globalBundle; 37 38 // WKBundlePageClient functions 39 40 void didClearWindowObjectForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKBundleScriptWorldRef world, const void *clientInfo) 41 { 42 WKURLRef wkURL = WKBundleFrameCopyURL(WKBundlePageGetMainFrame(page)); 43 CFURLRef cfURL = WKURLCopyCFURL(0, wkURL); 44 WKRelease(wkURL); 45 46 LOG(@"WKBundlePageClient - didClearWindowForFrame %@", [(NSURL *)cfURL absoluteString]); 47 CFRelease(cfURL); 48 49 WKStringRef messageName = WKStringCreateWithCFString(CFSTR("Callback")); 50 WKStringRef messageBody = WKStringCreateWithCFString(CFSTR("Window was cleared")); 51 WKBundlePostMessage(globalBundle, messageName, messageBody); 52 WKRelease(messageName); 53 WKRelease(messageBody); 54 } 55 56 57 // WKBundleClient 58 59 void didCreatePage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo) 60 { 61 LOG(@"WKBundleClient - didCreatePage\n"); 62 63 WKBundlePageLoaderClient client; 64 memset(&client, 0, sizeof(client)); 65 client.didClearWindowObjectForFrame = didClearWindowObjectForFrame; 66 67 WKBundlePageSetPageLoaderClient(page, &client); 68 } 69 70 void willDestroyPage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo) 71 { 72 LOG(@"WKBundleClient - willDestroyPage\n"); 73 } 74 75 void didRecieveMessage(WKBundleRef bundle, WKStringRef messageName, WKTypeRef messageBody, const void *clientInfo) 76 { 77 CFStringRef cfMessageName = WKStringCopyCFString(0, messageName); 78 79 WKTypeID typeID = WKGetTypeID(messageBody); 80 if (typeID == WKStringGetTypeID()) { 81 CFStringRef cfMessageBody = WKStringCopyCFString(0, (WKStringRef)messageBody); 82 LOG(@"WKBundleClient - didRecieveMessage - MessageName: %@ MessageBody %@", cfMessageName, cfMessageBody); 83 CFRelease(cfMessageBody); 84 } else { 85 LOG(@"WKBundleClient - didRecieveMessage - MessageName: %@ (MessageBody Unhandeled)\n", cfMessageName); 86 } 87 88 CFRelease(cfMessageName); 89 } 90 91 void WKBundleInitialize(WKBundleRef bundle, WKTypeRef initializationUserData) 92 { 93 globalBundle = bundle; 94 95 WKBundleClient client = { 96 0, 97 0, 98 didCreatePage, 99 willDestroyPage, 100 0, // didInitializePageGroup 101 didRecieveMessage 102 }; 103 WKBundleSetClient(bundle, &client); 104 } 105