summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/API/gtk/WebKitUserContent.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitUserContent.cpp')
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitUserContent.cpp259
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;
+}