WebKitWebExtension.cpp [plain text]
#include "config.h"
#include "WebKitWebExtension.h"
#include "APIString.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)
{
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*, const String& messageName, ImmutableDictionary& message)
{
if (messageName == String::fromUTF8("PrefetchDNS")) {
API::String* hostname = static_cast<API::String*>(message.get(String::fromUTF8("Hostname")));
WebCore::prefetchDNS(hostname->string());
} else
ASSERT_NOT_REACHED();
}
static void didCreatePage(WKBundleRef, WKBundlePageRef page, const void* clientInfo)
{
webkitWebExtensionPageCreated(WEBKIT_WEB_EXTENSION(clientInfo), toImpl(page));
}
static void willDestroyPage(WKBundleRef, WKBundlePageRef page, const void* clientInfo)
{
webkitWebExtensionPageDestroy(WEBKIT_WEB_EXTENSION(clientInfo), toImpl(page));
}
static void didReceiveMessage(WKBundleRef, 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, 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));
WKBundleClientV1 wkBundleClient = {
{
1, extension, },
didCreatePage,
willDestroyPage,
0, didReceiveMessage,
didReceiveMessageToPage
};
WKBundleSetClient(toAPI(bundle), &wkBundleClient.base);
return extension;
}
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;
}