Diff
Modified: trunk/Source/WebKit2/ChangeLog (111509 => 111510)
--- trunk/Source/WebKit2/ChangeLog 2012-03-21 08:24:18 UTC (rev 111509)
+++ trunk/Source/WebKit2/ChangeLog 2012-03-21 08:44:23 UTC (rev 111510)
@@ -1,3 +1,60 @@
+2012-03-21 Carlos Garcia Campos <cgar...@igalia.com>
+
+ [GTK] Add webkit_web_view_run_javascript() to WebKit2 GTK+
+ https://bugs.webkit.org/show_bug.cgi?id=75543
+
+ Reviewed by Martin Robinson.
+
+ * GNUmakefile.am: Add new files to compilation.
+ * UIProcess/API/gtk/WebKitError.cpp:
+ (webkit_javascript_error_quark): Add new error domain for
+ _javascript_ errors.
+ * UIProcess/API/gtk/WebKitError.h:
+ * UIProcess/API/gtk/WebKitJavascriptResult.cpp: Added.
+ (webkitJavascriptResultCreate): Create a WebKitJavascriptResult
+ for the given WKSerializedScriptValueRef.
+ (webkit_javascript_result_ref): Increment reference count of
+ WebKitJavascriptResult.
+ (webkit_javascript_result_unref): Decrement reference count of
+ WebKitJavascriptResult.
+ (webkit_javascript_result_get_global_context): Get global
+ _javascript_ context of the result.
+ (webkit_javascript_result_get_value): Get the JSValueRef of the
+ result.
+ * UIProcess/API/gtk/WebKitJavascriptResult.h: Added.
+ * UIProcess/API/gtk/WebKitJavascriptResultPrivate.h: Added.
+ * UIProcess/API/gtk/WebKitPrivate.h:
+ * UIProcess/API/gtk/WebKitWebView.cpp:
+ (webkitWebViewFinalize): Release the global _javascript_ context.
+ (webkit_web_view_get_javascript_global_context): Get or create the
+ global _javascript_ context.
+ (webkitWebViewRunJavaScriptCallback): Callback called by C API when
+ _javascript_ execution finishes.
+ (webkit_web_view_run_javascript): Asynchronously run a given
+ _javascript_.
+ (webkit_web_view_run_javascript_finish): Finish async operation
+ started by webkit_web_view_run_javascript().
+ * UIProcess/API/gtk/WebKitWebView.h:
+ * UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Add new symbols.
+ * UIProcess/API/gtk/docs/webkit2gtk.types: Add
+ webkit_javascript_result_get_type().
+ * UIProcess/API/gtk/tests/TestWebKitWebView.cpp:
+ (testWebViewRunJavaScript):
+ (beforeAll):
+ * UIProcess/API/gtk/tests/WebViewTest.cpp:
+ (WebViewTest::WebViewTest):
+ (WebViewTest::~WebViewTest):
+ (runJavaScriptReadyCallback):
+ (WebViewTest::runJavaScriptAndWaitUntilFinished):
+ (jsValueToCString):
+ (WebViewTest::_javascript_ResultToCString):
+ (WebViewTest::_javascript_ResultToNumber):
+ (WebViewTest::_javascript_ResultToBoolean):
+ (WebViewTest::_javascript_ResultIsNull):
+ (WebViewTest::_javascript_ResultIsUndefined):
+ * UIProcess/API/gtk/tests/WebViewTest.h:
+ * UIProcess/API/gtk/webkit2.h:
+
2012-03-20 Eric Seidel <e...@webkit.org>
Move wtf/Platform.h from _javascript_Core to Source/WTF/wtf
Modified: trunk/Source/WebKit2/GNUmakefile.am (111509 => 111510)
--- trunk/Source/WebKit2/GNUmakefile.am 2012-03-21 08:24:18 UTC (rev 111509)
+++ trunk/Source/WebKit2/GNUmakefile.am 2012-03-21 08:44:23 UTC (rev 111510)
@@ -92,6 +92,7 @@
$(WebKit2)/UIProcess/API/gtk/WebKitError.h \
$(WebKit2)/UIProcess/API/gtk/WebKitFindController.h \
$(WebKit2)/UIProcess/API/gtk/WebKitHitTestResult.h \
+ $(WebKit2)/UIProcess/API/gtk/WebKitJavascriptResult.h \
$(WebKit2)/UIProcess/API/gtk/WebKitNavigationPolicyDecision.h \
$(WebKit2)/UIProcess/API/gtk/WebKitPolicyDecision.h \
$(WebKit2)/UIProcess/API/gtk/WebKitPrintOperation.h \
@@ -555,6 +556,9 @@
Source/WebKit2/UIProcess/API/gtk/WebKitHitTestResult.cpp \
Source/WebKit2/UIProcess/API/gtk/WebKitHitTestResult.h \
Source/WebKit2/UIProcess/API/gtk/WebKitHitTestResultPrivate.h \
+ Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.cpp \
+ Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.h \
+ Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResultPrivate.h \
Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.h \
Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp \
Source/WebKit2/UIProcess/API/gtk/WebKitFindController.h \
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitError.cpp (111509 => 111510)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitError.cpp 2012-03-21 08:24:18 UTC (rev 111509)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitError.cpp 2012-03-21 08:44:23 UTC (rev 111510)
@@ -77,3 +77,8 @@
COMPILE_ASSERT_MATCHING_ENUM(WEBKIT_PRINT_ERROR_GENERAL, PrintErrorGeneral);
COMPILE_ASSERT_MATCHING_ENUM(WEBKIT_PRINT_ERROR_PRINTER_NOT_FOUND, PrintErrorPrinterNotFound);
COMPILE_ASSERT_MATCHING_ENUM(WEBKIT_PRINT_ERROR_INVALID_PAGE_RANGE, PrintErrorInvalidPageRange);
+
+GQuark webkit_javascript_error_quark()
+{
+ return g_quark_from_static_string("WebKitJavascriptError");
+}
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitError.h (111509 => 111510)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitError.h 2012-03-21 08:24:18 UTC (rev 111509)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitError.h 2012-03-21 08:44:23 UTC (rev 111510)
@@ -29,11 +29,12 @@
G_BEGIN_DECLS
-#define WEBKIT_NETWORK_ERROR webkit_network_error_quark ()
-#define WEBKIT_POLICY_ERROR webkit_policy_error_quark ()
-#define WEBKIT_PLUGIN_ERROR webkit_plugin_error_quark ()
-#define WEBKIT_DOWNLOAD_ERROR webkit_download_error_quark ()
-#define WEBKIT_PRINT_ERROR webkit_print_error_quark ()
+#define WEBKIT_NETWORK_ERROR webkit_network_error_quark ()
+#define WEBKIT_POLICY_ERROR webkit_policy_error_quark ()
+#define WEBKIT_PLUGIN_ERROR webkit_plugin_error_quark ()
+#define WEBKIT_DOWNLOAD_ERROR webkit_download_error_quark ()
+#define WEBKIT_PRINT_ERROR webkit_print_error_quark ()
+#define WEBKIT_JAVASCRIPT_ERROR webkit_print_error_quark ()
/**
* WebKitNetworkError:
@@ -119,21 +120,34 @@
WEBKIT_PRINT_ERROR_INVALID_PAGE_RANGE = 501
} WebKitPrintError;
+/**
+ * WebKitJavascriptError:
+ * @WEBKIT_JAVASCRIPT_ERROR_SCRIPT_FAILED: An exception was raised in _javascript_ execution
+ *
+ * Enum values used to denote errors happending when executing _javascript_
+ */
+typedef enum {
+ WEBKIT_JAVASCRIPT_ERROR_SCRIPT_FAILED = 699
+} WebKitJavascriptError;
+
WEBKIT_API GQuark
-webkit_network_error_quark (void);
+webkit_network_error_quark (void);
WEBKIT_API GQuark
-webkit_policy_error_quark (void);
+webkit_policy_error_quark (void);
WEBKIT_API GQuark
-webkit_plugin_error_quark (void);
+webkit_plugin_error_quark (void);
WEBKIT_API GQuark
-webkit_download_error_quark (void);
+webkit_download_error_quark (void);
WEBKIT_API GQuark
-webkit_print_error_quark (void);
+webkit_print_error_quark (void);
+WEBKIT_API GQuark
+webkit_javascript_error_quark (void);
+
G_END_DECLS
#endif
Added: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.cpp (0 => 111510)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.cpp (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.cpp 2012-03-21 08:44:23 UTC (rev 111510)
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2012 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 "WebKitJavascriptResult.h"
+
+#include "WebKitJavascriptResultPrivate.h"
+#include <wtf/gobject/GRefPtr.h>
+
+struct _WebKitJavascriptResult {
+ _WebKitJavascriptResult(WebKitWebView* view, WKSerializedScriptValueRef wkSerializedScriptValue)
+ : webView(view)
+ , referenceCount(1)
+ {
+ value = WKSerializedScriptValueDeserialize(wkSerializedScriptValue, webkit_web_view_get_javascript_global_context(view), 0);
+ }
+
+ GRefPtr<WebKitWebView> webView;
+ JSValueRef value;
+
+ int referenceCount;
+};
+
+G_DEFINE_BOXED_TYPE(WebKitJavascriptResult, webkit_javascript_result, webkit_javascript_result_ref, webkit_javascript_result_unref)
+
+WebKitJavascriptResult* webkitJavascriptResultCreate(WebKitWebView* webView, WKSerializedScriptValueRef wkSerializedScriptValue)
+{
+ WebKitJavascriptResult* result = g_slice_new(WebKitJavascriptResult);
+ new (result) WebKitJavascriptResult(webView, wkSerializedScriptValue);
+ return result;
+}
+
+/**
+ * webkit_javascript_result_ref:
+ * @js_result: a #WebKitJavascriptResult
+ *
+ * Atomically increments the reference count of @js_result by one. This
+ * function is MT-safe and may be called from any thread.
+ *
+ * Returns: The passed in #WebKitJavascriptResult
+ */
+WebKitJavascriptResult* webkit_javascript_result_ref(WebKitJavascriptResult* _javascript_Result)
+{
+ g_atomic_int_inc(&_javascript_Result->referenceCount);
+ return _javascript_Result;
+}
+
+/**
+ * webkit_javascript_result_unref:
+ * @js_result: a #WebKitJavascriptResult
+ *
+ * Atomically decrements the reference count of @js_result by one. If the
+ * reference count drops to 0, all memory allocated by the #WebKitJavascriptResult is
+ * released. This function is MT-safe and may be called from any
+ * thread.
+ */
+void webkit_javascript_result_unref(WebKitJavascriptResult* _javascript_Result)
+{
+ if (g_atomic_int_dec_and_test(&_javascript_Result->referenceCount)) {
+ _javascript_Result->~WebKitJavascriptResult();
+ g_slice_free(WebKitJavascriptResult, _javascript_Result);
+ }
+}
+
+/**
+ * webkit_javascript_result_get_global_context:
+ * @js_result: a #WebKitJavascriptResult
+ *
+ * Get the global _javascript_ context that should be used with the
+ * <function>JSValueRef</function> returned by webkit_javascript_result_get_value().
+ *
+ * Returns: the <function>JSGlobalContextRef</function> for the #WebKitJavascriptResult
+ */
+JSGlobalContextRef webkit_javascript_result_get_global_context(WebKitJavascriptResult* _javascript_Result)
+{
+ return webkit_web_view_get_javascript_global_context(_javascript_Result->webView.get());
+}
+
+/**
+ * webkit_javascript_result_get_value:
+ * @js_result: a #WebKitJavascriptResult
+ *
+ * Get the value of @js_result. You should use the <function>JSGlobalContextRef</function>
+ * returned by webkit_javascript_result_get_global_context() to use the <function>JSValueRef</function>.
+ *
+ * Returns: the <function>JSValueRef</function> of the #WebKitJavascriptResult
+ */
+JSValueRef webkit_javascript_result_get_value(WebKitJavascriptResult* _javascript_Result)
+{
+ return _javascript_Result->value;
+}
Added: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.h (0 => 111510)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.h (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.h 2012-03-21 08:44:23 UTC (rev 111510)
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2012 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.
+ */
+
+#if !defined(__WEBKIT2_H_INSIDE__) && !defined(WEBKIT2_COMPILATION)
+#error "Only <webkit2/webkit2.h> can be included directly."
+#endif
+
+#ifndef WebKitJavascriptResult_h
+#define WebKitJavascriptResult_h
+
+#include <_javascript_Core/JSBase.h>
+#include <glib-object.h>
+#include <webkit2/WebKitDefines.h>
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_JAVASCRIPT_RESULT (webkit_javascript_result_get_type())
+
+typedef struct _WebKitJavascriptResult WebKitJavascriptResult;
+
+
+WEBKIT_API GType
+webkit_javascript_result_get_type (void);
+
+WEBKIT_API WebKitJavascriptResult *
+webkit_javascript_result_ref (WebKitJavascriptResult *js_result);
+
+WEBKIT_API void
+webkit_javascript_result_unref (WebKitJavascriptResult *js_result);
+
+WEBKIT_API JSGlobalContextRef
+webkit_javascript_result_get_global_context (WebKitJavascriptResult *js_result);
+
+WEBKIT_API JSValueRef
+webkit_javascript_result_get_value (WebKitJavascriptResult *js_result);
+
+G_END_DECLS
+
+#endif
Added: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResultPrivate.h (0 => 111510)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResultPrivate.h (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResultPrivate.h 2012-03-21 08:44:23 UTC (rev 111510)
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2012 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.
+ */
+
+#ifndef WebKitJavascriptResultPrivate_h
+#define WebKitJavascriptResultPrivate_h
+
+#include "WebKitJavascriptResult.h"
+#include "WebKitPrivate.h"
+#include "WebKitWebView.h"
+
+WebKitJavascriptResult* webkitJavascriptResultCreate(WebKitWebView*, WKSerializedScriptValueRef);
+
+#endif // WebKitJavascriptResultPrivate_h
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitPrivate.h (111509 => 111510)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitPrivate.h 2012-03-21 08:24:18 UTC (rev 111509)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitPrivate.h 2012-03-21 08:44:23 UTC (rev 111510)
@@ -30,6 +30,7 @@
#include <WebKit2/WKDownload.h>
#include <WebKit2/WKFindOptions.h>
#include <WebKit2/WKRetainPtr.h>
+#include <WebKit2/WKSerializedScriptValue.h>
#include <WebKit2/WKString.h>
#include <WebKit2/WebKit2.h>
#include <glib.h>
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp (111509 => 111510)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp 2012-03-21 08:24:18 UTC (rev 111509)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp 2012-03-21 08:44:23 UTC (rev 111510)
@@ -25,6 +25,7 @@
#include "WebKitEnumTypes.h"
#include "WebKitError.h"
#include "WebKitHitTestResultPrivate.h"
+#include "WebKitJavascriptResultPrivate.h"
#include "WebKitLoaderClient.h"
#include "WebKitMarshal.h"
#include "WebKitPolicyClient.h"
@@ -38,6 +39,7 @@
#include "WebKitWebViewPrivate.h"
#include "WebKitWindowPropertiesPrivate.h"
#include "WebPageProxy.h"
+#include <_javascript_Core/APICast.h>
#include <WebCore/DragIcon.h>
#include <WebCore/GtkUtilities.h>
#include <glib/gi18n-lib.h>
@@ -100,6 +102,7 @@
unsigned mouseTargetModifiers;
GRefPtr<WebKitFindController> findController;
+ JSGlobalContextRef _javascript_GlobalContext;
};
static guint signals[LAST_SIGNAL] = { 0, };
@@ -255,7 +258,10 @@
static void webkitWebViewFinalize(GObject* object)
{
- WEBKIT_WEB_VIEW(object)->priv->~WebKitWebViewPrivate();
+ WebKitWebViewPrivate* priv = WEBKIT_WEB_VIEW(object)->priv;
+ if (priv->_javascript_GlobalContext)
+ JSGlobalContextRelease(priv->_javascript_GlobalContext);
+ priv->~WebKitWebViewPrivate();
G_OBJECT_CLASS(webkit_web_view_parent_class)->finalize(object);
}
@@ -1466,3 +1472,140 @@
return webView->priv->findController.get();
}
+
+/**
+ * webkit_web_view_get_javascript_global_context:
+ * @web_view: a #WebKitWebView
+ *
+ * Get the global _javascript_ context used by @web_view to deserialize the
+ * result values of scripts executed with webkit_web_view_run_javascript().
+ *
+ * Returns: the <function>JSGlobalContextRef</function> used by @web_view to deserialize
+ * the result values of scripts.
+ */
+JSGlobalContextRef webkit_web_view_get_javascript_global_context(WebKitWebView* webView)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0);
+
+ if (!webView->priv->_javascript_GlobalContext)
+ webView->priv->_javascript_GlobalContext = JSGlobalContextCreate(0);
+ return webView->priv->_javascript_GlobalContext;
+}
+
+static void webkitWebViewRunJavaScriptCallback(WKSerializedScriptValueRef wkSerializedScriptValue, WKErrorRef, void* context)
+{
+ GRefPtr<GSimpleAsyncResult> result = adoptGRef(G_SIMPLE_ASYNC_RESULT(context));
+ if (wkSerializedScriptValue) {
+ GRefPtr<WebKitWebView> webView = adoptGRef(WEBKIT_WEB_VIEW(g_async_result_get_source_object(G_ASYNC_RESULT(result.get()))));
+ WebKitJavascriptResult* scriptResult = webkitJavascriptResultCreate(webView.get(), wkSerializedScriptValue);
+ g_simple_async_result_set_op_res_gpointer(result.get(), scriptResult, reinterpret_cast<GDestroyNotify>(webkit_javascript_result_unref));
+ } else {
+ GError* error = 0;
+ g_set_error_literal(&error, WEBKIT_JAVASCRIPT_ERROR, WEBKIT_JAVASCRIPT_ERROR_SCRIPT_FAILED, _("An exception was raised in _javascript_"));
+ g_simple_async_result_take_error(result.get(), error);
+ }
+ g_simple_async_result_complete(result.get());
+}
+
+/**
+ * webkit_web_view_run_javascript:
+ * @web_view: a #WebKitWebView
+ * @script: the script to run
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the script finished
+ * @user_data: (closure): the data to pass to callback function
+ *
+ * Asynchronously run @script in the context of the current page in @web_view.
+ *
+ * When the operation is finished, @callback will be called. You can then call
+ * webkit_web_view_run_javascript_finish() to get the result of the operation.
+ */
+void webkit_web_view_run_javascript(WebKitWebView* webView, const gchar* script, GAsyncReadyCallback callback, gpointer userData)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
+ g_return_if_fail(script);
+
+ WKPageRef wkPage = toAPI(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView)));
+ WKRetainPtr<WKStringRef> wkScript = adoptWK(WKStringCreateWithUTF8CString(script));
+ GSimpleAsyncResult* result = g_simple_async_result_new(G_OBJECT(webView), callback, userData,
+ reinterpret_cast<gpointer>(webkit_web_view_run_javascript));
+ WKPageRunJavaScriptInMainFrame(wkPage, wkScript.get(), result, webkitWebViewRunJavaScriptCallback);
+}
+
+/**
+ * webkit_web_view_run_javascript_finish:
+ * @web_view: a #WebKitWebView
+ * @result: a #GAsyncResult
+ * @error: return location for error or %NULL to ignore
+ *
+ * Finish an asynchronous operation started with webkit_web_view_run_javascript().
+ *
+ * This is an example of using webkit_web_view_run_javascript() with a script returning
+ * a string:
+ *
+ * <informalexample><programlisting>
+ * static void
+ * web_view_javascript_finished (GObject *object,
+ * GAsyncResult *result,
+ * gpointer user_data)
+ * {
+ * WebKitJavascriptResult *js_result;
+ * JSValueRef value;
+ * JSGlobalContextRef context;
+ * GError *error = NULL;
+ *
+ * js_result = webkit_web_view_run_javascript_finish (WEBKIT_WEB_VIEW (object), result, &error);
+ * if (!js_result) {
+ * g_warning ("Error running _javascript_: %s", error->message);
+ * g_error_free (error);
+ * return;
+ * }
+ *
+ * context = webkit_javascript_result_get_global_context (js_result);
+ * value = webkit_javascript_result_get_value (js_result);
+ * if (JSValueIsString (context, value)) {
+ * JSStringRef *js_str_value;
+ * gchar *str_value;
+ * gsize str_length;
+ *
+ * js_str_value = JSValueToStringCopy (context, value, NULL));
+ * str_length = JSStringGetMaximumUTF8CStringSize (js_str_value);
+ * str_value = (gchar *)g_malloc (str_length));
+ * JSStringGetUTF8CString (js_str_value, str_value, str_length);
+ * JSStringRelease (js_str_value);
+ * g_print ("Script result: %s\n", str_value);
+ * g_free (str_value);
+ * } else {
+ * g_warning ("Error running _javascript_: unexpected return value");
+ * }
+ * webkit_javascript_result_unref (js_result);
+ * }
+ *
+ * static void
+ * web_view_get_link_url (WebKitWebView *web_view,
+ * const gchar *link_id)
+ * {
+ * gchar *script;
+ *
+ * script = g_strdup_printf ("window.document.getElementById('%s').href;", link_id);
+ * webkit_web_view_run_javascript (web_view, script, web_view_javascript_finished, NULL);
+ * g_free (script);
+ * }
+ * </programlisting></informalexample>
+ *
+ * Returns: (transfer full): a #WebKitJavascriptResult with the result of the last executed statement in @script
+ * or %NULL in case of error
+ */
+WebKitJavascriptResult* webkit_web_view_run_javascript_finish(WebKitWebView* webView, GAsyncResult* result, GError** error)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0);
+ g_return_val_if_fail(G_IS_ASYNC_RESULT(result), 0);
+
+ GSimpleAsyncResult* simpleResult = G_SIMPLE_ASYNC_RESULT(result);
+ g_warn_if_fail(g_simple_async_result_get_source_tag(simpleResult) == webkit_web_view_run_javascript);
+
+ if (g_simple_async_result_propagate_error(simpleResult, error))
+ return 0;
+
+ WebKitJavascriptResult* scriptResult = static_cast<WebKitJavascriptResult*>(g_simple_async_result_get_op_res_gpointer(simpleResult));
+ return scriptResult ? webkit_javascript_result_ref(scriptResult) : 0;
+}
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h (111509 => 111510)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h 2012-03-21 08:24:18 UTC (rev 111509)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h 2012-03-21 08:44:23 UTC (rev 111510)
@@ -28,10 +28,12 @@
#ifndef WebKitWebView_h
#define WebKitWebView_h
+#include <_javascript_Core/JSBase.h>
#include <webkit2/WebKitBackForwardList.h>
#include <webkit2/WebKitDefines.h>
#include <webkit2/WebKitFindController.h>
#include <webkit2/WebKitHitTestResult.h>
+#include <webkit2/WebKitJavascriptResult.h>
#include <webkit2/WebKitScriptDialog.h>
#include <webkit2/WebKitSettings.h>
#include <webkit2/WebKitURIRequest.h>
@@ -267,6 +269,18 @@
WEBKIT_API WebKitFindController *
webkit_web_view_get_find_controller (WebKitWebView *web_view);
+WEBKIT_API JSGlobalContextRef
+webkit_web_view_get_javascript_global_context (WebKitWebView *web_view);
+
+WEBKIT_API void
+webkit_web_view_run_javascript (WebKitWebView *web_view,
+ const gchar *script,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+WEBKIT_API WebKitJavascriptResult *
+webkit_web_view_run_javascript_finish (WebKitWebView *web_view,
+ GAsyncResult *result,
+ GError **error);
G_END_DECLS
#endif
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt (111509 => 111510)
--- trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt 2012-03-21 08:24:18 UTC (rev 111509)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt 2012-03-21 08:44:23 UTC (rev 111510)
@@ -49,8 +49,6 @@
WebKitWebView
WebKitLoadEvent
WebKitPolicyDecisionType
-WebKitScriptDialog
-WebKitScriptDialogType
<SUBSECTION Editing Commands>
WEBKIT_EDITING_COMMAND_CUT
@@ -89,6 +87,20 @@
webkit_web_view_can_execute_editing_command_finish
webkit_web_view_execute_editing_command
webkit_web_view_get_find_controller
+webkit_web_view_get_javascript_global_context
+webkit_web_view_run_javascript
+webkit_web_view_run_javascript_finish
+
+<SUBSECTION WebKitJavascriptResult>
+WebKitJavascriptResult
+webkit_javascript_result_ref
+webkit_javascript_result_unref
+webkit_javascript_result_get_global_context
+webkit_javascript_result_get_value
+
+<SUBSECTION WebKitScriptDialog>
+WebKitScriptDialog
+WebKitScriptDialogType
webkit_script_dialog_get_dialog_type
webkit_script_dialog_get_message
webkit_script_dialog_confirm_set_confirmed
@@ -103,10 +115,12 @@
WEBKIT_WEB_VIEW_CLASS
WEBKIT_IS_WEB_VIEW_CLASS
WEBKIT_WEB_VIEW_GET_CLASS
+WEBKIT_TYPE_JAVASCRIPT_RESULT
WEBKIT_TYPE_SCRIPT_DIALOG
<SUBSECTION Private>
webkit_web_view_get_type
+webkit_javascript_result_get_type
webkit_script_dialog_get_type
WebKitWebViewPrivate
</SECTION>
@@ -466,16 +480,19 @@
WEBKIT_POLICY_ERROR
WEBKIT_DOWNLOAD_ERROR
WEBKIT_PRINT_ERROR
+WEBKIT_JAVASCRIPT_ERROR
WebKitNetworkError
WebKitPluginError
WebKitPolicyError
WebKitDownloadError
WebKitPrintError
+WebKitJavascriptError
webkit_network_error_quark
webkit_plugin_error_quark
webkit_policy_error_quark
webkit_download_error_quark
webkit_print_error_quark
+webkit_javascript_error_quark
</SECTION>
<SECTION>
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk.types (111509 => 111510)
--- trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk.types 2012-03-21 08:24:18 UTC (rev 111509)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk.types 2012-03-21 08:44:23 UTC (rev 111510)
@@ -11,3 +11,4 @@
webkit_download_get_type
webkit_find_controller_get_type
webkit_script_dialog_get_type
+webkit_javascript_result_get_type
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp (111509 => 111510)
--- trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp 2012-03-21 08:24:18 UTC (rev 111509)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp 2012-03-21 08:44:23 UTC (rev 111510)
@@ -452,6 +452,66 @@
g_assert_cmpfloat(webkit_web_view_get_zoom_level(test->m_webView), ==, 2.5);
}
+static void testWebViewRunJavaScript(WebViewTest* test, gconstpointer)
+{
+ static const char* html = "<html><body><a id='WebKitLink' href='' title='WebKitGTK+ Title'>WebKitGTK+ Website</a></body></html>";
+ test->loadHtml(html, 0);
+ test->waitUntilLoadFinished();
+
+ GOwnPtr<GError> error;
+ WebKitJavascriptResult* _javascript_Result = test->runJavaScriptAndWaitUntilFinished("window.document.getElementById('WebKitLink').title;", &error.outPtr());
+ g_assert(_javascript_Result);
+ g_assert(!error.get());
+ GOwnPtr<char> valueString(WebViewTest::_javascript_ResultToCString(_javascript_Result));
+ g_assert_cmpstr(valueString.get(), ==, "WebKitGTK+ Title");
+
+ _javascript_Result = test->runJavaScriptAndWaitUntilFinished("window.document.getElementById('WebKitLink').href;", &error.outPtr());
+ g_assert(_javascript_Result);
+ g_assert(!error.get());
+ valueString.set(WebViewTest::_javascript_ResultToCString(_javascript_Result));
+ g_assert_cmpstr(valueString.get(), ==, "http://www.webkitgtk.org/");
+
+ _javascript_Result = test->runJavaScriptAndWaitUntilFinished("window.document.getElementById('WebKitLink').textContent", &error.outPtr());
+ g_assert(_javascript_Result);
+ g_assert(!error.get());
+ valueString.set(WebViewTest::_javascript_ResultToCString(_javascript_Result));
+ g_assert_cmpstr(valueString.get(), ==, "WebKitGTK+ Website");
+
+ _javascript_Result = test->runJavaScriptAndWaitUntilFinished("a = 25;", &error.outPtr());
+ g_assert(_javascript_Result);
+ g_assert(!error.get());
+ g_assert_cmpfloat(WebViewTest::_javascript_ResultToNumber(_javascript_Result), ==, 25);
+
+ _javascript_Result = test->runJavaScriptAndWaitUntilFinished("a = 2.5;", &error.outPtr());
+ g_assert(_javascript_Result);
+ g_assert(!error.get());
+ g_assert_cmpfloat(WebViewTest::_javascript_ResultToNumber(_javascript_Result), ==, 2.5);
+
+ _javascript_Result = test->runJavaScriptAndWaitUntilFinished("a = true", &error.outPtr());
+ g_assert(_javascript_Result);
+ g_assert(!error.get());
+ g_assert(WebViewTest::_javascript_ResultToBoolean(_javascript_Result));
+
+ _javascript_Result = test->runJavaScriptAndWaitUntilFinished("a = false", &error.outPtr());
+ g_assert(_javascript_Result);
+ g_assert(!error.get());
+ g_assert(!WebViewTest::_javascript_ResultToBoolean(_javascript_Result));
+
+ _javascript_Result = test->runJavaScriptAndWaitUntilFinished("a = null", &error.outPtr());
+ g_assert(_javascript_Result);
+ g_assert(!error.get());
+ g_assert(WebViewTest::_javascript_ResultIsNull(_javascript_Result));
+
+ _javascript_Result = test->runJavaScriptAndWaitUntilFinished("function Foo() { a = 25; } Foo();", &error.outPtr());
+ g_assert(_javascript_Result);
+ g_assert(!error.get());
+ g_assert(WebViewTest::_javascript_ResultIsUndefined(_javascript_Result));
+
+ _javascript_Result = test->runJavaScriptAndWaitUntilFinished("foo();", &error.outPtr());
+ g_assert(!_javascript_Result);
+ g_assert_error(error.get(), WEBKIT_JAVASCRIPT_ERROR, WEBKIT_JAVASCRIPT_ERROR_SCRIPT_FAILED);
+}
+
void beforeAll()
{
WebViewTest::add("WebKitWebView", "default-context", testWebViewDefaultContext);
@@ -463,6 +523,7 @@
UIClientTest::add("WebKitWebView", "window-properties", testWebViewWindowProperties);
UIClientTest::add("WebKitWebView", "mouse-target", testWebViewMouseTarget);
WebViewTest::add("WebKitWebView", "zoom-level", testWebViewZoomLevel);
+ WebViewTest::add("WebKitWebView", "run-_javascript_", testWebViewRunJavaScript);
}
void afterAll()
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebViewTest.cpp (111509 => 111510)
--- trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebViewTest.cpp 2012-03-21 08:24:18 UTC (rev 111509)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebViewTest.cpp 2012-03-21 08:44:23 UTC (rev 111510)
@@ -21,12 +21,14 @@
#include "config.h"
#include "WebViewTest.h"
+#include <_javascript_Core/JSRetainPtr.h>
#include <WebCore/GOwnPtrGtk.h>
WebViewTest::WebViewTest()
: m_webView(WEBKIT_WEB_VIEW(g_object_ref_sink(webkit_web_view_new())))
, m_mainLoop(g_main_loop_new(0, TRUE))
, m_parentWindow(0)
+ , m_javascriptResult(0)
{
assertObjectIsDeletedWhenTestFinishes(G_OBJECT(m_webView));
}
@@ -35,6 +37,8 @@
{
if (m_parentWindow)
gtk_widget_destroy(m_parentWindow);
+ if (m_javascriptResult)
+ webkit_javascript_result_unref(m_javascriptResult);
g_object_unref(m_webView);
g_main_loop_unref(m_mainLoop);
}
@@ -194,3 +198,84 @@
gtk_main_do_event(event.get());
}
+static void runJavaScriptReadyCallback(GObject*, GAsyncResult* result, WebViewTest* test)
+{
+ test->m_javascriptResult = webkit_web_view_run_javascript_finish(test->m_webView, result, test->m_javascriptError);
+ g_main_loop_quit(test->m_mainLoop);
+}
+
+WebKitJavascriptResult* WebViewTest::runJavaScriptAndWaitUntilFinished(const char* _javascript_, GError** error)
+{
+ if (m_javascriptResult)
+ webkit_javascript_result_unref(m_javascriptResult);
+ m_javascriptResult = 0;
+ m_javascriptError = error;
+ webkit_web_view_run_javascript(m_webView, _javascript_, reinterpret_cast<GAsyncReadyCallback>(runJavaScriptReadyCallback), this);
+ g_main_loop_run(m_mainLoop);
+
+ return m_javascriptResult;
+}
+
+static char* jsValueToCString(JSGlobalContextRef context, JSValueRef value)
+{
+ g_assert(value);
+ g_assert(JSValueIsString(context, value));
+
+ JSRetainPtr<JSStringRef> stringValue(Adopt, JSValueToStringCopy(context, value, 0));
+ g_assert(stringValue);
+
+ size_t cStringLength = JSStringGetMaximumUTF8CStringSize(stringValue.get());
+ char* cString = static_cast<char*>(g_malloc(cStringLength));
+ JSStringGetUTF8CString(stringValue.get(), cString, cStringLength);
+ return cString;
+}
+
+char* WebViewTest::_javascript_ResultToCString(WebKitJavascriptResult* _javascript_Result)
+{
+ JSGlobalContextRef context = webkit_javascript_result_get_global_context(_javascript_Result);
+ g_assert(context);
+ return jsValueToCString(context, webkit_javascript_result_get_value(_javascript_Result));
+}
+
+double WebViewTest::_javascript_ResultToNumber(WebKitJavascriptResult* _javascript_Result)
+{
+ JSGlobalContextRef context = webkit_javascript_result_get_global_context(_javascript_Result);
+ g_assert(context);
+ JSValueRef value = webkit_javascript_result_get_value(_javascript_Result);
+ g_assert(value);
+ g_assert(JSValueIsNumber(context, value));
+
+ return JSValueToNumber(context, value, 0);
+}
+
+bool WebViewTest::_javascript_ResultToBoolean(WebKitJavascriptResult* _javascript_Result)
+{
+ JSGlobalContextRef context = webkit_javascript_result_get_global_context(_javascript_Result);
+ g_assert(context);
+ JSValueRef value = webkit_javascript_result_get_value(_javascript_Result);
+ g_assert(value);
+ g_assert(JSValueIsBoolean(context, value));
+
+ return JSValueToBoolean(context, value);
+}
+
+bool WebViewTest::_javascript_ResultIsNull(WebKitJavascriptResult* _javascript_Result)
+{
+ JSGlobalContextRef context = webkit_javascript_result_get_global_context(_javascript_Result);
+ g_assert(context);
+ JSValueRef value = webkit_javascript_result_get_value(_javascript_Result);
+ g_assert(value);
+
+ return JSValueIsNull(context, value);
+}
+
+bool WebViewTest::_javascript_ResultIsUndefined(WebKitJavascriptResult* _javascript_Result)
+{
+ JSGlobalContextRef context = webkit_javascript_result_get_global_context(_javascript_Result);
+ g_assert(context);
+ JSValueRef value = webkit_javascript_result_get_value(_javascript_Result);
+ g_assert(value);
+
+ return JSValueIsUndefined(context, value);
+}
+
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebViewTest.h (111509 => 111510)
--- trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebViewTest.h 2012-03-21 08:24:18 UTC (rev 111509)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebViewTest.h 2012-03-21 08:44:23 UTC (rev 111510)
@@ -48,11 +48,22 @@
void mouseMoveTo(int x, int y, unsigned int mouseModifiers = 0);
+ WebKitJavascriptResult* runJavaScriptAndWaitUntilFinished(const char* _javascript_, GError**);
+
+ // _javascript_ result helpers.
+ static char* _javascript_ResultToCString(WebKitJavascriptResult*);
+ static double _javascript_ResultToNumber(WebKitJavascriptResult*);
+ static bool _javascript_ResultToBoolean(WebKitJavascriptResult*);
+ static bool _javascript_ResultIsNull(WebKitJavascriptResult*);
+ static bool _javascript_ResultIsUndefined(WebKitJavascriptResult*);
+
WebKitWebView* m_webView;
GMainLoop* m_mainLoop;
CString m_activeURI;
GtkWidget* m_parentWindow;
CString m_expectedTitle;
+ WebKitJavascriptResult* m_javascriptResult;
+ GError** m_javascriptError;
};
#endif // WebViewTest_h
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h (111509 => 111510)
--- trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h 2012-03-21 08:24:18 UTC (rev 111509)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h 2012-03-21 08:44:23 UTC (rev 111510)
@@ -32,6 +32,7 @@
#include <webkit2/WebKitError.h>
#include <webkit2/WebKitFindController.h>
#include <webkit2/WebKitHitTestResult.h>
+#include <webkit2/WebKitJavascriptResult.h>
#include <webkit2/WebKitPrintOperation.h>
#include <webkit2/WebKitScriptDialog.h>
#include <webkit2/WebKitSettings.h>
Modified: trunk/Tools/ChangeLog (111509 => 111510)
--- trunk/Tools/ChangeLog 2012-03-21 08:24:18 UTC (rev 111509)
+++ trunk/Tools/ChangeLog 2012-03-21 08:44:23 UTC (rev 111510)
@@ -1,3 +1,13 @@
+2012-03-21 Carlos Garcia Campos <cgar...@igalia.com>
+
+ [GTK] Add webkit_web_view_run_javascript() to WebKit2 GTK+
+ https://bugs.webkit.org/show_bug.cgi?id=75543
+
+ Reviewed by Martin Robinson.
+
+ * MiniBrowser/gtk/GNUmakefile.am: Add _javascript_core_cppflags to
+ MiniBrowser CPP flags.
+
2012-03-20 Eric Seidel <e...@webkit.org>
Move wtf/Platform.h from _javascript_Core to Source/WTF/wtf
Modified: trunk/Tools/MiniBrowser/gtk/GNUmakefile.am (111509 => 111510)
--- trunk/Tools/MiniBrowser/gtk/GNUmakefile.am 2012-03-21 08:24:18 UTC (rev 111509)
+++ trunk/Tools/MiniBrowser/gtk/GNUmakefile.am 2012-03-21 08:44:23 UTC (rev 111510)
@@ -10,6 +10,7 @@
-I$(top_builddir)/DerivedSources/WebKit2/webkit2gtk/include \
-DWEBKIT_EXEC_PATH=\"${shell pwd}/$(top_builddir)/Programs/\" \
$(global_cppflags) \
+ $(_javascript_core_cppflags) \
$(GLIB_CFLAGS) \
$(GTK_CFLAGS)