WebKitUserContent.cpp [plain text]
#include "config.h"
#include "WebKitUserContent.h"
#include "WebKitPrivate.h"
#include "WebKitUserContentPrivate.h"
#include <wtf/text/CString.h>
#include <wtf/text/StringBuilder.h>
using namespace WebCore;
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 Vector<String> toStringVector(const char* const* strv)
{
if (!strv)
return Vector<String>();
Vector<String> result;
for (auto str = strv; *str; ++str)
result.append(std::move(String::fromUTF8(*str)));
return result;
}
struct _WebKitUserStyleSheet {
_WebKitUserStyleSheet(const gchar* source, WebKitUserContentInjectedFrames injectedFrames, WebKitUserStyleLevel level, const char* const* whitelist, const char* const* blacklist)
: userStyleSheet(std::make_unique<UserStyleSheet>(
String::fromUTF8(source), URL { },
toStringVector(whitelist), toStringVector(blacklist),
toUserContentInjectedFrames(injectedFrames),
toUserStyleLevel(level)))
, referenceCount(1)
{
}
std::unique_ptr<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();
g_slice_free(WebKitUserStyleSheet, 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 = g_slice_new(WebKitUserStyleSheet);
new (userStyleSheet) WebKitUserStyleSheet(source, injectedFrames, level, whitelist, blacklist);
return userStyleSheet;
}
const UserStyleSheet& webkitUserStyleSheetGetUserStyleSheet(WebKitUserStyleSheet* userStyleSheet)
{
return *userStyleSheet->userStyleSheet;
}