1/* 2 * Copyright (C) 2010 Apple Inc. All rights reserved. 3 * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies) 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 16 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 18 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 19 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 20 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 21 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 22 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 24 * THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#include "config.h" 28#include "QtBuiltinBundle.h" 29 30#include "QtBuiltinBundlePage.h" 31#include "WKBundlePage.h" 32#include "WKNumber.h" 33#include "WKString.h" 34#include "WKStringQt.h" 35#include "WKType.h" 36#include <wtf/PassOwnPtr.h> 37 38namespace WebKit { 39 40QtBuiltinBundle::~QtBuiltinBundle() 41{ 42 // For OwnPtr's sake. 43} 44 45QtBuiltinBundle& QtBuiltinBundle::shared() 46{ 47 static QtBuiltinBundle& shared = *new QtBuiltinBundle; 48 return shared; 49} 50 51void QtBuiltinBundle::initialize(WKBundleRef bundle) 52{ 53 m_bundle = bundle; 54 55 WKBundleClient client; 56 memset(&client, 0, sizeof(WKBundleClient)); 57 client.version = kWKBundleClientCurrentVersion; 58 client.clientInfo = this; 59 client.didCreatePage = QtBuiltinBundle::didCreatePage; 60 client.willDestroyPage = QtBuiltinBundle::willDestroyPage; 61 client.didReceiveMessageToPage = QtBuiltinBundle::didReceiveMessageToPage; 62 WKBundleSetClient(m_bundle, &client); 63} 64 65void QtBuiltinBundle::didCreatePage(WKBundleRef, WKBundlePageRef page, const void* clientInfo) 66{ 67 static_cast<QtBuiltinBundle*>(const_cast<void*>(clientInfo))->didCreatePage(page); 68} 69 70void QtBuiltinBundle::willDestroyPage(WKBundleRef, WKBundlePageRef page, const void* clientInfo) 71{ 72 static_cast<QtBuiltinBundle*>(const_cast<void*>(clientInfo))->willDestroyPage(page); 73} 74 75void QtBuiltinBundle::didReceiveMessageToPage(WKBundleRef, WKBundlePageRef page, WKStringRef messageName, WKTypeRef messageBody, const void* clientInfo) 76{ 77 static_cast<QtBuiltinBundle*>(const_cast<void*>(clientInfo))->didReceiveMessageToPage(page, messageName, messageBody); 78} 79 80void QtBuiltinBundle::didCreatePage(WKBundlePageRef page) 81{ 82 m_pages.add(page, adoptPtr(new QtBuiltinBundlePage(this, page))); 83} 84 85void QtBuiltinBundle::willDestroyPage(WKBundlePageRef page) 86{ 87 m_pages.remove(page); 88} 89 90void QtBuiltinBundle::didReceiveMessageToPage(WKBundlePageRef page, WKStringRef messageName, WKTypeRef messageBody) 91{ 92 if (WKStringIsEqualToUTF8CString(messageName, "MessageToNavigatorQtObject")) 93 handleMessageToNavigatorQtObject(page, messageBody); 94 else if (WKStringIsEqualToUTF8CString(messageName, "SetNavigatorQtObjectEnabled")) 95 handleSetNavigatorQtObjectEnabled(page, messageBody); 96} 97 98void QtBuiltinBundle::handleMessageToNavigatorQtObject(WKBundlePageRef page, WKTypeRef messageBody) 99{ 100 ASSERT(messageBody); 101 ASSERT(WKGetTypeID(messageBody) == WKStringGetTypeID()); 102 WKStringRef contents = static_cast<WKStringRef>(messageBody); 103 104 QtBuiltinBundlePage* bundlePage = m_pages.get(page); 105 if (!bundlePage) 106 return; 107 bundlePage->didReceiveMessageToNavigatorQtObject(contents); 108} 109 110void QtBuiltinBundle::handleSetNavigatorQtObjectEnabled(WKBundlePageRef page, WKTypeRef messageBody) 111{ 112 ASSERT(messageBody); 113 ASSERT(WKGetTypeID(messageBody) == WKBooleanGetTypeID()); 114 WKBooleanRef enabled = static_cast<WKBooleanRef>(messageBody); 115 116 QtBuiltinBundlePage* bundlePage = m_pages.get(page); 117 if (!bundlePage) 118 return; 119 bundlePage->setNavigatorQtObjectEnabled(enabled); 120} 121 122} // namespace WebKit 123