WebKitScriptWorld.cpp [plain text]
#include "config.h"
#include "WebKitScriptWorld.h"
#include "WebKitMarshal.h"
#include "WebKitPrivate.h"
#include "WebKitScriptWorldPrivate.h"
#include <wtf/HashMap.h>
#include <wtf/NeverDestroyed.h>
using namespace WebKit;
using namespace WebCore;
enum {
WINDOW_OBJECT_CLEARED,
LAST_SIGNAL
};
typedef HashMap<InjectedBundleScriptWorld*, WebKitScriptWorld*> ScriptWorldMap;
static ScriptWorldMap& scriptWorlds()
{
static NeverDestroyed<ScriptWorldMap> map;
return map;
}
struct _WebKitScriptWorldPrivate {
~_WebKitScriptWorldPrivate()
{
ASSERT(scriptWorlds().contains(scriptWorld.get()));
scriptWorlds().remove(scriptWorld.get());
}
RefPtr<InjectedBundleScriptWorld> scriptWorld;
};
static guint signals[LAST_SIGNAL] = { 0, };
WEBKIT_DEFINE_TYPE(WebKitScriptWorld, webkit_script_world, G_TYPE_OBJECT)
static void webkit_script_world_class_init(WebKitScriptWorldClass* klass)
{
signals[WINDOW_OBJECT_CLEARED] = g_signal_new(
"window-object-cleared",
G_TYPE_FROM_CLASS(klass),
G_SIGNAL_RUN_LAST,
0, 0, 0,
webkit_marshal_VOID__OBJECT_OBJECT,
G_TYPE_NONE, 2,
WEBKIT_TYPE_WEB_PAGE,
WEBKIT_TYPE_FRAME);
}
WebKitScriptWorld* webkitScriptWorldGet(InjectedBundleScriptWorld* scriptWorld)
{
return scriptWorlds().get(scriptWorld);
}
InjectedBundleScriptWorld* webkitScriptWorldGetInjectedBundleScriptWorld(WebKitScriptWorld* world)
{
return world->priv->scriptWorld.get();
}
void webkitScriptWorldWindowObjectCleared(WebKitScriptWorld* world, WebKitWebPage* page, WebKitFrame* frame)
{
g_signal_emit(world, signals[WINDOW_OBJECT_CLEARED], 0, page, frame);
}
static WebKitScriptWorld* webkitScriptWorldCreate(PassRefPtr<InjectedBundleScriptWorld> scriptWorld)
{
WebKitScriptWorld* world = WEBKIT_SCRIPT_WORLD(g_object_new(WEBKIT_TYPE_SCRIPT_WORLD, NULL));
world->priv->scriptWorld = scriptWorld;
ASSERT(!scriptWorlds().contains(world->priv->scriptWorld.get()));
scriptWorlds().add(world->priv->scriptWorld.get(), world);
return world;
}
static gpointer createDefaultScriptWorld(gpointer)
{
return webkitScriptWorldCreate(InjectedBundleScriptWorld::normalWorld());
}
WebKitScriptWorld* webkit_script_world_get_default(void)
{
static GOnce onceInit = G_ONCE_INIT;
return WEBKIT_SCRIPT_WORLD(g_once(&onceInit, createDefaultScriptWorld, 0));
}
WebKitScriptWorld* webkit_script_world_new(void)
{
return webkitScriptWorldCreate(InjectedBundleScriptWorld::create());
}