diff options
Diffstat (limited to 'Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebExtension.cpp')
-rw-r--r-- | Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebExtension.cpp | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebExtension.cpp b/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebExtension.cpp new file mode 100644 index 000000000..4074e5947 --- /dev/null +++ b/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebExtension.cpp @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2012 Igalia S.L. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2,1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "config.h" +#include "WebKitWebExtension.h" + +#include "ImmutableDictionary.h" +#include "WKBundleAPICast.h" +#include "WKBundlePage.h" +#include "WebKitPrivate.h" +#include "WebKitWebExtensionPrivate.h" +#include "WebKitWebPagePrivate.h" +#include <WebCore/DNS.h> +#include <wtf/HashMap.h> +#include <wtf/gobject/GRefPtr.h> + +using namespace WebKit; + +enum { + PAGE_CREATED, + + LAST_SIGNAL +}; + +typedef HashMap<WebPage*, GRefPtr<WebKitWebPage> > WebPageMap; + +struct _WebKitWebExtensionPrivate { + WebPageMap pages; +}; + +static guint signals[LAST_SIGNAL] = { 0, }; + +WEBKIT_DEFINE_TYPE(WebKitWebExtension, webkit_web_extension, G_TYPE_OBJECT) + +static void webkit_web_extension_class_init(WebKitWebExtensionClass* klass) +{ + /** + * WebKitWebExtension::page-created: + * @extension: the #WebKitWebExtension on which the signal is emitted + * @web_page: the #WebKitWebPage created + * + * This signal is emitted when a new #WebKitWebPage is created in + * the Web Process. + */ + signals[PAGE_CREATED] = g_signal_new( + "page-created", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, + 0, 0, 0, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + WEBKIT_TYPE_WEB_PAGE); +} + +static void webkitWebExtensionPageCreated(WebKitWebExtension* extension, WebPage* page) +{ + GRefPtr<WebKitWebPage> webPage = adoptGRef(webkitWebPageCreate(page)); + extension->priv->pages.add(page, webPage); + g_signal_emit(extension, signals[PAGE_CREATED], 0, webPage.get()); +} + +static void webkitWebExtensionPageDestroy(WebKitWebExtension* extension, WebPage* page) +{ + extension->priv->pages.remove(page); +} + +static void webkitWebExtensionDidReceiveMessage(WebKitWebExtension* extension, const String& messageName, ImmutableDictionary& message) +{ + if (messageName == String::fromUTF8("PrefetchDNS")) { + WebString* hostname = static_cast<WebString*>(message.get(String::fromUTF8("Hostname"))); + WebCore::prefetchDNS(hostname->string()); + } else + ASSERT_NOT_REACHED(); +} + +static void didCreatePage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo) +{ + webkitWebExtensionPageCreated(WEBKIT_WEB_EXTENSION(clientInfo), toImpl(page)); +} + +static void willDestroyPage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo) +{ + webkitWebExtensionPageDestroy(WEBKIT_WEB_EXTENSION(clientInfo), toImpl(page)); +} + +static void didReceiveMessage(WKBundleRef bundle, WKStringRef name, WKTypeRef messageBody, const void* clientInfo) +{ + ASSERT(WKGetTypeID(messageBody) == WKDictionaryGetTypeID()); + webkitWebExtensionDidReceiveMessage(WEBKIT_WEB_EXTENSION(clientInfo), toImpl(name)->string(), *toImpl(static_cast<WKDictionaryRef>(messageBody))); +} + +static void didReceiveMessageToPage(WKBundleRef bundle, WKBundlePageRef page, WKStringRef name, WKTypeRef messageBody, const void* clientInfo) +{ + ASSERT(WKGetTypeID(messageBody) == WKDictionaryGetTypeID()); + if (WebKitWebPage* webPage = WEBKIT_WEB_EXTENSION(clientInfo)->priv->pages.get(toImpl(page)).get()) + webkitWebPageDidReceiveMessage(webPage, toImpl(name)->string(), *toImpl(static_cast<WKDictionaryRef>(messageBody))); +} + +WebKitWebExtension* webkitWebExtensionCreate(InjectedBundle* bundle) +{ + WebKitWebExtension* extension = WEBKIT_WEB_EXTENSION(g_object_new(WEBKIT_TYPE_WEB_EXTENSION, NULL)); + + WKBundleClient wkBundleClient = { + kWKBundleClientCurrentVersion, + extension, // clientInfo + didCreatePage, + willDestroyPage, + 0, // didInitializePageGroup + didReceiveMessage, + didReceiveMessageToPage + }; + WKBundleSetClient(toAPI(bundle), &wkBundleClient); + + return extension; +} + +/** + * webkit_web_extension_get_page: + * @extension: a #WebKitWebExtension + * @page_id: the identifier of the #WebKitWebPage to get + * + * Get the web page of the given @page_id. + * + * Returns: (transfer none): the #WebKitWebPage for the given @page_id, or %NULL if the + * identifier doesn't correspond to an exsiting web page. + */ +WebKitWebPage* webkit_web_extension_get_page(WebKitWebExtension* extension, guint64 pageID) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_EXTENSION(extension), 0); + + WebKitWebExtensionPrivate* priv = extension->priv; + WebPageMap::const_iterator end = priv->pages.end(); + for (WebPageMap::const_iterator it = priv->pages.begin(); it != end; ++it) + if (it->key->pageID() == pageID) + return it->value.get(); + + return 0; +} |