diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitUserContent.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/API/gtk/WebKitUserContent.cpp | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitUserContent.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitUserContent.cpp new file mode 100644 index 000000000..6fac63c6f --- /dev/null +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitUserContent.cpp @@ -0,0 +1,259 @@ +/* + * Copyright (C) 2014 Igalia S.L. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 "WebKitUserContent.h" + +#include "WebKitPrivate.h" +#include "WebKitUserContentPrivate.h" +#include <wtf/text/CString.h> + +using namespace WebCore; + +/** + * SECTION:WebKitUserContent + * @short_description: Defines user content types which affect web pages. + * @title: User content + * + * See also: #WebKitUserContentManager + * + * Since: 2.6 + */ + +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) + : userStyleSheet(adoptRef(new API::UserStyleSheet(UserStyleSheet { + String::fromUTF8(source), URL { }, + toStringVector(whitelist), toStringVector(blacklist), + toUserContentInjectedFrames(injectedFrames), + toUserStyleLevel(level) }, API::UserContentWorld::normalWorld()))) + , 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) + +/** + * webkit_user_style_sheet_ref: + * @user_style_sheet: a #WebKitUserStyleSheet + * + * Atomically increments the reference count of @user_style_sheet by one. + * This function is MT-safe and may be called from any thread. + * + * Returns: The passed #WebKitUserStyleSheet + * + * Since: 2.6 + */ +WebKitUserStyleSheet* webkit_user_style_sheet_ref(WebKitUserStyleSheet* userStyleSheet) +{ + g_atomic_int_inc(&userStyleSheet->referenceCount); + return userStyleSheet; +} + +/** + * webkit_user_style_sheet_unref: + * @user_style_sheet: a #WebKitUserStyleSheet + * + * Atomically decrements the reference count of @user_style_sheet by one. + * If the reference count drops to 0, all memory allocated by + * #WebKitUserStyleSheet is released. This function is MT-safe and may be + * called from any thread. + * + * Since: 2.6 + */ +void webkit_user_style_sheet_unref(WebKitUserStyleSheet* userStyleSheet) +{ + if (g_atomic_int_dec_and_test(&userStyleSheet->referenceCount)) { + userStyleSheet->~WebKitUserStyleSheet(); + fastFree(userStyleSheet); + } +} + +/** + * webkit_user_style_sheet_new: + * @source: Source code of the user style sheet. + * @injected_frames: A #WebKitUserContentInjectedFrames value + * @level: A #WebKitUserStyleLevel + * @whitelist: (array zero-terminated=1) (allow-none): A whitelist of URI patterns or %NULL + * @blacklist: (array zero-terminated=1) (allow-none): A blacklist of URI patterns or %NULL + * + * Creates a new user style sheet. Style sheets can be applied to some URIs + * only by passing non-null values for @whitelist or @blacklist. Passing a + * %NULL whitelist implies that all URIs are on the whitelist. The style + * sheet is applied if an URI matches the whitelist and not the blacklist. + * URI patterns must be of the form `[protocol]://[host]/[path]`, where the + * *host* and *path* components can contain the wildcard character (`*`) to + * represent zero or more other characters. + * + * Returns: A new #WebKitUserStyleSheet + * + * Since: 2.6 + */ +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); + 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) + : userScript(adoptRef(new API::UserScript(UserScript { + String::fromUTF8(source), URL { }, + toStringVector(whitelist), toStringVector(blacklist), + toUserScriptInjectionTime(injectionTime), + toUserContentInjectedFrames(injectedFrames) }, API::UserContentWorld::normalWorld()))) + , referenceCount(1) + { + } + + RefPtr<API::UserScript> userScript; + int referenceCount; +}; + +G_DEFINE_BOXED_TYPE(WebKitUserScript, webkit_user_script, webkit_user_script_ref, webkit_user_script_unref) + +/** + * webkit_user_script_ref: + * @user_script: a #WebKitUserScript + * + * Atomically increments the reference count of @user_script by one. + * This function is MT-safe and may be called from any thread. + * + * Returns: The passed #WebKitUserScript + * + * Since: 2.6 + */ +WebKitUserScript* webkit_user_script_ref(WebKitUserScript* userScript) +{ + g_atomic_int_inc(&userScript->referenceCount); + return userScript; +} + +/** + * webkit_user_script_unref: + * @user_script: a #WebKitUserScript + * + * Atomically decrements the reference count of @user_script by one. + * If the reference count drops to 0, all memory allocated by + * #WebKitUserScript is released. This function is MT-safe and may be called + * from any thread. + * + * Since: 2.6 + */ +void webkit_user_script_unref(WebKitUserScript* userScript) +{ + if (g_atomic_int_dec_and_test(&userScript->referenceCount)) { + userScript->~WebKitUserScript(); + fastFree(userScript); + } +} + +/** + * webkit_user_script_new: + * @source: Source code of the user script. + * @injected_frames: A #WebKitUserContentInjectedFrames value + * @injection_time: A #WebKitUserScriptInjectionTime value + * @whitelist: (array zero-terminated=1) (allow-none): A whitelist of URI patterns or %NULL + * @blacklist: (array zero-terminated=1) (allow-none): A blacklist of URI patterns or %NULL + * + * Creates a new user script. Scripts can be applied to some URIs + * only by passing non-null values for @whitelist or @blacklist. Passing a + * %NULL whitelist implies that all URIs are on the whitelist. The script + * is applied if an URI matches the whitelist and not the blacklist. + * URI patterns must be of the form `[protocol]://[host]/[path]`, where the + * *host* and *path* components can contain the wildcard character (`*`) to + * represent zero or more other characters. + * + * Returns: A new #WebKitUserScript + * + * Since: 2.6 + */ +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); + return userScript; +} + +API::UserScript& webkitUserScriptGetUserScript(WebKitUserScript* userScript) +{ + return *userScript->userScript; +} |