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