WebKitUserContent.cpp [plain text]
#include "config.h"
#include "WebKitUserContent.h"
#include "WebKitUserContentPrivate.h"
#include <wtf/HashMap.h>
#include <wtf/NeverDestroyed.h>
#include <wtf/text/CString.h>
using namespace WebCore;
API::UserContentWorld& webkitUserContentWorld(const char* worldName)
{
static NeverDestroyed<HashMap<CString, RefPtr<API::UserContentWorld>>> map;
return *map.get().ensure(worldName, [worldName = String::fromUTF8(worldName)] { return API::UserContentWorld::worldWithName(worldName); }).iterator->value;
}
static inline UserContentInjectedFrames toUserContentInjectedFrames(WebKitUserContentInjectedFrames injectedFrames)
{
switch (injectedFrames) {
case WEBKIT_USER_CONTENT_INJECT_TOP_FRAME:
return InjectInTopFrameOnly;
case WEBKIT_USER_CONTENT_INJECT_ALL_FRAMES:
return InjectInAllFrames;
default:
ASSERT_NOT_REACHED();
return InjectInAllFrames;
}
}
static inline UserStyleLevel toUserStyleLevel(WebKitUserStyleLevel styleLevel)
{
switch (styleLevel) {
case WEBKIT_USER_STYLE_LEVEL_USER:
return UserStyleUserLevel;
case WEBKIT_USER_STYLE_LEVEL_AUTHOR:
return UserStyleAuthorLevel;
default:
ASSERT_NOT_REACHED();
return UserStyleAuthorLevel;
}
}
static inline UserScriptInjectionTime toUserScriptInjectionTime(WebKitUserScriptInjectionTime injectionTime)
{
switch (injectionTime) {
case WEBKIT_USER_SCRIPT_INJECT_AT_DOCUMENT_START:
return InjectAtDocumentStart;
case WEBKIT_USER_SCRIPT_INJECT_AT_DOCUMENT_END:
return InjectAtDocumentEnd;
default:
ASSERT_NOT_REACHED();
return InjectAtDocumentStart;
}
}
static inline Vector<String> toStringVector(const char* const* strv)
{
if (!strv)
return Vector<String>();
Vector<String> result;
for (auto str = strv; *str; ++str)
result.append(String::fromUTF8(*str));
return result;
}
struct _WebKitUserStyleSheet {
_WebKitUserStyleSheet(const gchar* source, WebKitUserContentInjectedFrames injectedFrames, WebKitUserStyleLevel level, const char* const* whitelist, const char* const* blacklist, API::UserContentWorld& world)
: userStyleSheet(adoptRef(new API::UserStyleSheet(UserStyleSheet {
String::fromUTF8(source), URL { },
toStringVector(whitelist), toStringVector(blacklist),
toUserContentInjectedFrames(injectedFrames),
toUserStyleLevel(level) }, world)))
, referenceCount(1)
{
}
RefPtr<API::UserStyleSheet> userStyleSheet;
int referenceCount;
};
G_DEFINE_BOXED_TYPE(WebKitUserStyleSheet, webkit_user_style_sheet, webkit_user_style_sheet_ref, webkit_user_style_sheet_unref)
WebKitUserStyleSheet* webkit_user_style_sheet_ref(WebKitUserStyleSheet* userStyleSheet)
{
g_atomic_int_inc(&userStyleSheet->referenceCount);
return userStyleSheet;
}
void webkit_user_style_sheet_unref(WebKitUserStyleSheet* userStyleSheet)
{
if (g_atomic_int_dec_and_test(&userStyleSheet->referenceCount)) {
userStyleSheet->~WebKitUserStyleSheet();
fastFree(userStyleSheet);
}
}
WebKitUserStyleSheet* webkit_user_style_sheet_new(const gchar* source, WebKitUserContentInjectedFrames injectedFrames, WebKitUserStyleLevel level, const char* const* whitelist, const char* const* blacklist)
{
g_return_val_if_fail(source, nullptr);
WebKitUserStyleSheet* userStyleSheet = static_cast<WebKitUserStyleSheet*>(fastMalloc(sizeof(WebKitUserStyleSheet)));
new (userStyleSheet) WebKitUserStyleSheet(source, injectedFrames, level, whitelist, blacklist, API::UserContentWorld::normalWorld());
return userStyleSheet;
}
WebKitUserStyleSheet* webkit_user_style_sheet_new_for_world(const gchar* source, WebKitUserContentInjectedFrames injectedFrames, WebKitUserStyleLevel level, const char* worldName, const char* const* whitelist, const char* const* blacklist)
{
g_return_val_if_fail(source, nullptr);
g_return_val_if_fail(worldName, nullptr);
WebKitUserStyleSheet* userStyleSheet = static_cast<WebKitUserStyleSheet*>(fastMalloc(sizeof(WebKitUserStyleSheet)));
new (userStyleSheet) WebKitUserStyleSheet(source, injectedFrames, level, whitelist, blacklist, webkitUserContentWorld(worldName));
return userStyleSheet;
}
API::UserStyleSheet& webkitUserStyleSheetGetUserStyleSheet(WebKitUserStyleSheet* userStyleSheet)
{
return *userStyleSheet->userStyleSheet;
}
struct _WebKitUserScript {
_WebKitUserScript(const gchar* source, WebKitUserContentInjectedFrames injectedFrames, WebKitUserScriptInjectionTime injectionTime, const gchar* const* whitelist, const gchar* const* blacklist, API::UserContentWorld& world)
: userScript(adoptRef(new API::UserScript(UserScript {
String::fromUTF8(source), URL { },
toStringVector(whitelist), toStringVector(blacklist),
toUserScriptInjectionTime(injectionTime),
toUserContentInjectedFrames(injectedFrames) }, world)))
, referenceCount(1)
{
}
RefPtr<API::UserScript> userScript;
int referenceCount;
};
G_DEFINE_BOXED_TYPE(WebKitUserScript, webkit_user_script, webkit_user_script_ref, webkit_user_script_unref)
WebKitUserScript* webkit_user_script_ref(WebKitUserScript* userScript)
{
g_atomic_int_inc(&userScript->referenceCount);
return userScript;
}
void webkit_user_script_unref(WebKitUserScript* userScript)
{
if (g_atomic_int_dec_and_test(&userScript->referenceCount)) {
userScript->~WebKitUserScript();
fastFree(userScript);
}
}
WebKitUserScript* webkit_user_script_new(const gchar* source, WebKitUserContentInjectedFrames injectedFrames, WebKitUserScriptInjectionTime injectionTime, const gchar* const* whitelist, const gchar* const* blacklist)
{
g_return_val_if_fail(source, nullptr);
WebKitUserScript* userScript = static_cast<WebKitUserScript*>(fastMalloc(sizeof(WebKitUserScript)));
new (userScript) WebKitUserScript(source, injectedFrames, injectionTime, whitelist, blacklist, API::UserContentWorld::normalWorld());
return userScript;
}
WebKitUserScript* webkit_user_script_new_for_world(const gchar* source, WebKitUserContentInjectedFrames injectedFrames, WebKitUserScriptInjectionTime injectionTime, const char* worldName, const gchar* const* whitelist, const gchar* const* blacklist)
{
g_return_val_if_fail(source, nullptr);
g_return_val_if_fail(worldName, nullptr);
WebKitUserScript* userScript = static_cast<WebKitUserScript*>(fastMalloc(sizeof(WebKitUserScript)));
new (userScript) WebKitUserScript(source, injectedFrames, injectionTime, whitelist, blacklist, webkitUserContentWorld(worldName));
return userScript;
}
API::UserScript& webkitUserScriptGetUserScript(WebKitUserScript* userScript)
{
return *userScript->userScript;
}