106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen/*
206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Copyright (C) 2010 Apple Inc. All rights reserved.
306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *
406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Redistribution and use in source and binary forms, with or without
506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * modification, are permitted provided that the following conditions
606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * are met:
706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * 1. Redistributions of source code must retain the above copyright
806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *    notice, this list of conditions and the following disclaimer.
906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * 2. Redistributions in binary form must reproduce the above copyright
1006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *    notice, this list of conditions and the following disclaimer in the
1106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *    documentation and/or other materials provided with the distribution.
1206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen *
1306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * THE POSSIBILITY OF SUCH DAMAGE.
2406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen */
2506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
2606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <Cocoa/Cocoa.h>
2706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <WebKit2/WKBundle.h>
28ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include <WebKit2/WKBundleFrame.h>
2906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <WebKit2/WKBundleInitialize.h>
3006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <WebKit2/WKBundlePage.h>
3106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <WebKit2/WKString.h>
3206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <WebKit2/WKStringCF.h>
3306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <WebKit2/WKURLCF.h>
3406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <stdio.h>
3506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
3606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenstatic WKBundleRef globalBundle;
3706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
38dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch// WKBundlePageClient functions
3906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid didClearWindowObjectForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKBundleScriptWorldRef world, const void *clientInfo)
4106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
420617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    WKURLRef wkURL = WKBundleFrameCopyURL(WKBundlePageGetMainFrame(page));
430617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    CFURLRef cfURL = WKURLCopyCFURL(0, wkURL);
44e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    WKRelease(wkURL);
450617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
46db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    LOG(@"WKBundlePageClient - didClearWindowForFrame %@", [(NSURL *)cfURL absoluteString]);
4706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    CFRelease(cfURL);
4806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
49db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    WKStringRef messageName = WKStringCreateWithCFString(CFSTR("Callback"));
50db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    WKStringRef messageBody = WKStringCreateWithCFString(CFSTR("Window was cleared"));
51db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    WKBundlePostMessage(globalBundle, messageName, messageBody);
52e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    WKRelease(messageName);
53e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    WKRelease(messageBody);
5406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
5506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
5606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
5706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen// WKBundleClient
5806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
59db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid didCreatePage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo)
6006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
6106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    LOG(@"WKBundleClient - didCreatePage\n");
6206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
63dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    WKBundlePageLoaderClient client;
64dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    memset(&client, 0, sizeof(client));
65dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    client.didClearWindowObjectForFrame = didClearWindowObjectForFrame;
66dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WKBundlePageSetPageLoaderClient(page, &client);
6806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
6906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
70db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid willDestroyPage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo)
7106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
7206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    LOG(@"WKBundleClient - willDestroyPage\n");
7306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
7406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
75db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid didRecieveMessage(WKBundleRef bundle, WKStringRef messageName, WKTypeRef messageBody, const void *clientInfo)
7606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
77db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    CFStringRef cfMessageName = WKStringCopyCFString(0, messageName);
78db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
79db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    WKTypeID typeID = WKGetTypeID(messageBody);
80db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    if (typeID == WKStringGetTypeID()) {
81db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        CFStringRef cfMessageBody = WKStringCopyCFString(0, (WKStringRef)messageBody);
82db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        LOG(@"WKBundleClient - didRecieveMessage - MessageName: %@ MessageBody %@", cfMessageName, cfMessageBody);
83db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        CFRelease(cfMessageBody);
84db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    } else {
85db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        LOG(@"WKBundleClient - didRecieveMessage - MessageName: %@ (MessageBody Unhandeled)\n", cfMessageName);
86db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    }
87db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
88db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    CFRelease(cfMessageName);
8906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
9006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
9128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid WKBundleInitialize(WKBundleRef bundle, WKTypeRef initializationUserData)
9206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
9306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    globalBundle = bundle;
9406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
9506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    WKBundleClient client = {
9606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        0,
9706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        0,
98db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        didCreatePage,
99db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        willDestroyPage,
100f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        0, // didInitializePageGroup
101db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block        didRecieveMessage
10206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    };
10306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    WKBundleSetClient(bundle, &client);
10406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
105