Changeset 111510 in webkit


Ignore:
Timestamp:
Mar 21, 2012 1:44:23 AM (12 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK] Add webkit_web_view_run_javascript() to WebKit2 GTK+
https://bugs.webkit.org/show_bug.cgi?id=75543

Reviewed by Martin Robinson.

Source/WebKit2:

  • 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::javascriptResultToCString):
(WebViewTest::javascriptResultToNumber):
(WebViewTest::javascriptResultToBoolean):
(WebViewTest::javascriptResultIsNull):
(WebViewTest::javascriptResultIsUndefined):

  • UIProcess/API/gtk/tests/WebViewTest.h:
  • UIProcess/API/gtk/webkit2.h:

Tools:

  • MiniBrowser/gtk/GNUmakefile.am: Add javascriptcore_cppflags to

MiniBrowser CPP flags.

Location:
trunk
Files:
3 added
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r111504 r111510  
     12012-03-21  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Add webkit_web_view_run_javascript() to WebKit2 GTK+
     4        https://bugs.webkit.org/show_bug.cgi?id=75543
     5
     6        Reviewed by Martin Robinson.
     7
     8        * GNUmakefile.am: Add new files to compilation.
     9        * UIProcess/API/gtk/WebKitError.cpp:
     10        (webkit_javascript_error_quark): Add new error domain for
     11        Javascript errors.
     12        * UIProcess/API/gtk/WebKitError.h:
     13        * UIProcess/API/gtk/WebKitJavascriptResult.cpp: Added.
     14        (webkitJavascriptResultCreate): Create a WebKitJavascriptResult
     15        for the given WKSerializedScriptValueRef.
     16        (webkit_javascript_result_ref): Increment reference count of
     17        WebKitJavascriptResult.
     18        (webkit_javascript_result_unref): Decrement reference count of
     19        WebKitJavascriptResult.
     20        (webkit_javascript_result_get_global_context): Get global
     21        javascript context of the result.
     22        (webkit_javascript_result_get_value): Get the JSValueRef of the
     23        result.
     24        * UIProcess/API/gtk/WebKitJavascriptResult.h: Added.
     25        * UIProcess/API/gtk/WebKitJavascriptResultPrivate.h: Added.
     26        * UIProcess/API/gtk/WebKitPrivate.h:
     27        * UIProcess/API/gtk/WebKitWebView.cpp:
     28        (webkitWebViewFinalize): Release the global javascript context.
     29        (webkit_web_view_get_javascript_global_context): Get or create the
     30        global javascript context.
     31        (webkitWebViewRunJavaScriptCallback): Callback called by C API when
     32        javascript execution finishes.
     33        (webkit_web_view_run_javascript): Asynchronously run a given
     34        javascript.
     35        (webkit_web_view_run_javascript_finish): Finish async operation
     36        started by webkit_web_view_run_javascript().
     37        * UIProcess/API/gtk/WebKitWebView.h:
     38        * UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Add new symbols.
     39        * UIProcess/API/gtk/docs/webkit2gtk.types: Add
     40        webkit_javascript_result_get_type().
     41        * UIProcess/API/gtk/tests/TestWebKitWebView.cpp:
     42        (testWebViewRunJavaScript):
     43        (beforeAll):
     44        * UIProcess/API/gtk/tests/WebViewTest.cpp:
     45        (WebViewTest::WebViewTest):
     46        (WebViewTest::~WebViewTest):
     47        (runJavaScriptReadyCallback):
     48        (WebViewTest::runJavaScriptAndWaitUntilFinished):
     49        (jsValueToCString):
     50        (WebViewTest::javascriptResultToCString):
     51        (WebViewTest::javascriptResultToNumber):
     52        (WebViewTest::javascriptResultToBoolean):
     53        (WebViewTest::javascriptResultIsNull):
     54        (WebViewTest::javascriptResultIsUndefined):
     55        * UIProcess/API/gtk/tests/WebViewTest.h:
     56        * UIProcess/API/gtk/webkit2.h:
     57
    1582012-03-20  Eric Seidel  <eric@webkit.org>
    259
  • trunk/Source/WebKit2/GNUmakefile.am

    r111340 r111510  
    9393        $(WebKit2)/UIProcess/API/gtk/WebKitFindController.h \
    9494        $(WebKit2)/UIProcess/API/gtk/WebKitHitTestResult.h \
     95        $(WebKit2)/UIProcess/API/gtk/WebKitJavascriptResult.h \
    9596        $(WebKit2)/UIProcess/API/gtk/WebKitNavigationPolicyDecision.h \
    9697        $(WebKit2)/UIProcess/API/gtk/WebKitPolicyDecision.h \
     
    556557        Source/WebKit2/UIProcess/API/gtk/WebKitHitTestResult.h \
    557558        Source/WebKit2/UIProcess/API/gtk/WebKitHitTestResultPrivate.h \
     559        Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.cpp \
     560        Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.h \
     561        Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResultPrivate.h \
    558562        Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.h \
    559563        Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp \
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitError.cpp

    r110714 r111510  
    7878COMPILE_ASSERT_MATCHING_ENUM(WEBKIT_PRINT_ERROR_PRINTER_NOT_FOUND, PrintErrorPrinterNotFound);
    7979COMPILE_ASSERT_MATCHING_ENUM(WEBKIT_PRINT_ERROR_INVALID_PAGE_RANGE, PrintErrorInvalidPageRange);
     80
     81GQuark webkit_javascript_error_quark()
     82{
     83    return g_quark_from_static_string("WebKitJavascriptError");
     84}
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitError.h

    r110714 r111510  
    3030G_BEGIN_DECLS
    3131
    32 #define WEBKIT_NETWORK_ERROR  webkit_network_error_quark ()
    33 #define WEBKIT_POLICY_ERROR   webkit_policy_error_quark ()
    34 #define WEBKIT_PLUGIN_ERROR   webkit_plugin_error_quark ()
    35 #define WEBKIT_DOWNLOAD_ERROR webkit_download_error_quark ()
    36 #define WEBKIT_PRINT_ERROR    webkit_print_error_quark ()
     32#define WEBKIT_NETWORK_ERROR    webkit_network_error_quark ()
     33#define WEBKIT_POLICY_ERROR     webkit_policy_error_quark ()
     34#define WEBKIT_PLUGIN_ERROR     webkit_plugin_error_quark ()
     35#define WEBKIT_DOWNLOAD_ERROR   webkit_download_error_quark ()
     36#define WEBKIT_PRINT_ERROR      webkit_print_error_quark ()
     37#define WEBKIT_JAVASCRIPT_ERROR webkit_print_error_quark ()
    3738
    3839/**
     
    120121} WebKitPrintError;
    121122
    122 WEBKIT_API GQuark
    123 webkit_network_error_quark  (void);
     123/**
     124 * WebKitJavascriptError:
     125 * @WEBKIT_JAVASCRIPT_ERROR_SCRIPT_FAILED: An exception was raised in Javascript execution
     126 *
     127 * Enum values used to denote errors happending when executing Javascript
     128 */
     129typedef enum {
     130    WEBKIT_JAVASCRIPT_ERROR_SCRIPT_FAILED = 699
     131} WebKitJavascriptError;
    124132
    125133WEBKIT_API GQuark
    126 webkit_policy_error_quark   (void);
     134webkit_network_error_quark    (void);
    127135
    128136WEBKIT_API GQuark
    129 webkit_plugin_error_quark   (void);
     137webkit_policy_error_quark     (void);
    130138
    131139WEBKIT_API GQuark
    132 webkit_download_error_quark (void);
     140webkit_plugin_error_quark    (void);
    133141
    134142WEBKIT_API GQuark
    135 webkit_print_error_quark    (void);
     143webkit_download_error_quark   (void);
     144
     145WEBKIT_API GQuark
     146webkit_print_error_quark      (void);
     147
     148WEBKIT_API GQuark
     149webkit_javascript_error_quark (void);
    136150
    137151G_END_DECLS
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitPrivate.h

    r109222 r111510  
    3131#include <WebKit2/WKFindOptions.h>
    3232#include <WebKit2/WKRetainPtr.h>
     33#include <WebKit2/WKSerializedScriptValue.h>
    3334#include <WebKit2/WKString.h>
    3435#include <WebKit2/WebKit2.h>
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp

    r109880 r111510  
    2626#include "WebKitError.h"
    2727#include "WebKitHitTestResultPrivate.h"
     28#include "WebKitJavascriptResultPrivate.h"
    2829#include "WebKitLoaderClient.h"
    2930#include "WebKitMarshal.h"
     
    3940#include "WebKitWindowPropertiesPrivate.h"
    4041#include "WebPageProxy.h"
     42#include <JavaScriptCore/APICast.h>
    4143#include <WebCore/DragIcon.h>
    4244#include <WebCore/GtkUtilities.h>
     
    101103
    102104    GRefPtr<WebKitFindController> findController;
     105    JSGlobalContextRef javascriptGlobalContext;
    103106};
    104107
     
    256259static void webkitWebViewFinalize(GObject* object)
    257260{
    258     WEBKIT_WEB_VIEW(object)->priv->~WebKitWebViewPrivate();
     261    WebKitWebViewPrivate* priv = WEBKIT_WEB_VIEW(object)->priv;
     262    if (priv->javascriptGlobalContext)
     263        JSGlobalContextRelease(priv->javascriptGlobalContext);
     264    priv->~WebKitWebViewPrivate();
    259265    G_OBJECT_CLASS(webkit_web_view_parent_class)->finalize(object);
    260266}
     
    14671473    return webView->priv->findController.get();
    14681474}
     1475
     1476/**
     1477 * webkit_web_view_get_javascript_global_context:
     1478 * @web_view: a #WebKitWebView
     1479 *
     1480 * Get the global JavaScript context used by @web_view to deserialize the
     1481 * result values of scripts executed with webkit_web_view_run_javascript().
     1482 *
     1483 * Returns: the <function>JSGlobalContextRef</function> used by @web_view to deserialize
     1484 *    the result values of scripts.
     1485 */
     1486JSGlobalContextRef webkit_web_view_get_javascript_global_context(WebKitWebView* webView)
     1487{
     1488    g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0);
     1489
     1490    if (!webView->priv->javascriptGlobalContext)
     1491        webView->priv->javascriptGlobalContext = JSGlobalContextCreate(0);
     1492    return webView->priv->javascriptGlobalContext;
     1493}
     1494
     1495static void webkitWebViewRunJavaScriptCallback(WKSerializedScriptValueRef wkSerializedScriptValue, WKErrorRef, void* context)
     1496{
     1497    GRefPtr<GSimpleAsyncResult> result = adoptGRef(G_SIMPLE_ASYNC_RESULT(context));
     1498    if (wkSerializedScriptValue) {
     1499        GRefPtr<WebKitWebView> webView = adoptGRef(WEBKIT_WEB_VIEW(g_async_result_get_source_object(G_ASYNC_RESULT(result.get()))));
     1500        WebKitJavascriptResult* scriptResult = webkitJavascriptResultCreate(webView.get(), wkSerializedScriptValue);
     1501        g_simple_async_result_set_op_res_gpointer(result.get(), scriptResult, reinterpret_cast<GDestroyNotify>(webkit_javascript_result_unref));
     1502    } else {
     1503        GError* error = 0;
     1504        g_set_error_literal(&error, WEBKIT_JAVASCRIPT_ERROR, WEBKIT_JAVASCRIPT_ERROR_SCRIPT_FAILED, _("An exception was raised in JavaScript"));
     1505        g_simple_async_result_take_error(result.get(), error);
     1506    }
     1507    g_simple_async_result_complete(result.get());
     1508}
     1509
     1510/**
     1511 * webkit_web_view_run_javascript:
     1512 * @web_view: a #WebKitWebView
     1513 * @script: the script to run
     1514 * @callback: (scope async): a #GAsyncReadyCallback to call when the script finished
     1515 * @user_data: (closure): the data to pass to callback function
     1516 *
     1517 * Asynchronously run @script in the context of the current page in @web_view.
     1518 *
     1519 * When the operation is finished, @callback will be called. You can then call
     1520 * webkit_web_view_run_javascript_finish() to get the result of the operation.
     1521 */
     1522void webkit_web_view_run_javascript(WebKitWebView* webView, const gchar* script, GAsyncReadyCallback callback, gpointer userData)
     1523{
     1524    g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
     1525    g_return_if_fail(script);
     1526
     1527    WKPageRef wkPage = toAPI(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView)));
     1528    WKRetainPtr<WKStringRef> wkScript = adoptWK(WKStringCreateWithUTF8CString(script));
     1529    GSimpleAsyncResult* result = g_simple_async_result_new(G_OBJECT(webView), callback, userData,
     1530                                                           reinterpret_cast<gpointer>(webkit_web_view_run_javascript));
     1531    WKPageRunJavaScriptInMainFrame(wkPage, wkScript.get(), result, webkitWebViewRunJavaScriptCallback);
     1532}
     1533
     1534/**
     1535 * webkit_web_view_run_javascript_finish:
     1536 * @web_view: a #WebKitWebView
     1537 * @result: a #GAsyncResult
     1538 * @error: return location for error or %NULL to ignore
     1539 *
     1540 * Finish an asynchronous operation started with webkit_web_view_run_javascript().
     1541 *
     1542 * This is an example of using webkit_web_view_run_javascript() with a script returning
     1543 * a string:
     1544 *
     1545 * <informalexample><programlisting>
     1546 * static void
     1547 * web_view_javascript_finished (GObject      *object,
     1548 *                               GAsyncResult *result,
     1549 *                               gpointer      user_data)
     1550 * {
     1551 *     WebKitJavascriptResult *js_result;
     1552 *     JSValueRef              value;
     1553 *     JSGlobalContextRef      context;
     1554 *     GError                 *error = NULL;
     1555 *
     1556 *     js_result = webkit_web_view_run_javascript_finish (WEBKIT_WEB_VIEW (object), result, &error);
     1557 *     if (!js_result) {
     1558 *         g_warning ("Error running javascript: %s", error->message);
     1559 *         g_error_free (error);
     1560 *         return;
     1561 *     }
     1562 *
     1563 *     context = webkit_javascript_result_get_global_context (js_result);
     1564 *     value = webkit_javascript_result_get_value (js_result);
     1565 *     if (JSValueIsString (context, value)) {
     1566 *         JSStringRef *js_str_value;
     1567 *         gchar       *str_value;
     1568 *         gsize        str_length;
     1569 *
     1570 *         js_str_value = JSValueToStringCopy (context, value, NULL));
     1571 *         str_length = JSStringGetMaximumUTF8CStringSize (js_str_value);
     1572 *         str_value = (gchar *)g_malloc (str_length));
     1573 *         JSStringGetUTF8CString (js_str_value, str_value, str_length);
     1574 *         JSStringRelease (js_str_value);
     1575 *         g_print ("Script result: %s\n", str_value);
     1576 *         g_free (str_value);
     1577 *     } else {
     1578 *         g_warning ("Error running javascript: unexpected return value");
     1579 *     }
     1580 *     webkit_javascript_result_unref (js_result);
     1581 * }
     1582 *
     1583 * static void
     1584 * web_view_get_link_url (WebKitWebView *web_view,
     1585 *                        const gchar   *link_id)
     1586 * {
     1587 *     gchar *script;
     1588 *
     1589 *     script = g_strdup_printf ("window.document.getElementById('%s').href;", link_id);
     1590 *     webkit_web_view_run_javascript (web_view, script, web_view_javascript_finished, NULL);
     1591 *     g_free (script);
     1592 * }
     1593 * </programlisting></informalexample>
     1594 *
     1595 * Returns: (transfer full): a #WebKitJavascriptResult with the result of the last executed statement in @script
     1596 *    or %NULL in case of error
     1597 */
     1598WebKitJavascriptResult* webkit_web_view_run_javascript_finish(WebKitWebView* webView, GAsyncResult* result, GError** error)
     1599{
     1600    g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0);
     1601    g_return_val_if_fail(G_IS_ASYNC_RESULT(result), 0);
     1602
     1603    GSimpleAsyncResult* simpleResult = G_SIMPLE_ASYNC_RESULT(result);
     1604    g_warn_if_fail(g_simple_async_result_get_source_tag(simpleResult) == webkit_web_view_run_javascript);
     1605
     1606    if (g_simple_async_result_propagate_error(simpleResult, error))
     1607        return 0;
     1608
     1609    WebKitJavascriptResult* scriptResult = static_cast<WebKitJavascriptResult*>(g_simple_async_result_get_op_res_gpointer(simpleResult));
     1610    return scriptResult ? webkit_javascript_result_ref(scriptResult) : 0;
     1611}
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h

    r109881 r111510  
    2929#define WebKitWebView_h
    3030
     31#include <JavaScriptCore/JSBase.h>
    3132#include <webkit2/WebKitBackForwardList.h>
    3233#include <webkit2/WebKitDefines.h>
    3334#include <webkit2/WebKitFindController.h>
    3435#include <webkit2/WebKitHitTestResult.h>
     36#include <webkit2/WebKitJavascriptResult.h>
    3537#include <webkit2/WebKitScriptDialog.h>
    3638#include <webkit2/WebKitSettings.h>
     
    268270webkit_web_view_get_find_controller                (WebKitWebView             *web_view);
    269271
     272WEBKIT_API JSGlobalContextRef
     273webkit_web_view_get_javascript_global_context      (WebKitWebView             *web_view);
     274
     275WEBKIT_API void
     276webkit_web_view_run_javascript                     (WebKitWebView             *web_view,
     277                                                    const gchar               *script,
     278                                                    GAsyncReadyCallback        callback,
     279                                                    gpointer                   user_data);
     280WEBKIT_API WebKitJavascriptResult *
     281webkit_web_view_run_javascript_finish              (WebKitWebView             *web_view,
     282                                                    GAsyncResult              *result,
     283                                                    GError                   **error);
    270284G_END_DECLS
    271285
  • trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt

    r111399 r111510  
    5050WebKitLoadEvent
    5151WebKitPolicyDecisionType
    52 WebKitScriptDialog
    53 WebKitScriptDialogType
    5452
    5553<SUBSECTION Editing Commands>
     
    9088webkit_web_view_execute_editing_command
    9189webkit_web_view_get_find_controller
     90webkit_web_view_get_javascript_global_context
     91webkit_web_view_run_javascript
     92webkit_web_view_run_javascript_finish
     93
     94<SUBSECTION WebKitJavascriptResult>
     95WebKitJavascriptResult
     96webkit_javascript_result_ref
     97webkit_javascript_result_unref
     98webkit_javascript_result_get_global_context
     99webkit_javascript_result_get_value
     100
     101<SUBSECTION WebKitScriptDialog>
     102WebKitScriptDialog
     103WebKitScriptDialogType
    92104webkit_script_dialog_get_dialog_type
    93105webkit_script_dialog_get_message
     
    104116WEBKIT_IS_WEB_VIEW_CLASS
    105117WEBKIT_WEB_VIEW_GET_CLASS
     118WEBKIT_TYPE_JAVASCRIPT_RESULT
    106119WEBKIT_TYPE_SCRIPT_DIALOG
    107120
    108121<SUBSECTION Private>
    109122webkit_web_view_get_type
     123webkit_javascript_result_get_type
    110124webkit_script_dialog_get_type
    111125WebKitWebViewPrivate
     
    467481WEBKIT_DOWNLOAD_ERROR
    468482WEBKIT_PRINT_ERROR
     483WEBKIT_JAVASCRIPT_ERROR
    469484WebKitNetworkError
    470485WebKitPluginError
     
    472487WebKitDownloadError
    473488WebKitPrintError
     489WebKitJavascriptError
    474490webkit_network_error_quark
    475491webkit_plugin_error_quark
     
    477493webkit_download_error_quark
    478494webkit_print_error_quark
     495webkit_javascript_error_quark
    479496</SECTION>
    480497
  • trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk.types

    r109880 r111510  
    1212webkit_find_controller_get_type
    1313webkit_script_dialog_get_type
     14webkit_javascript_result_get_type
  • trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp

    r109880 r111510  
    453453}
    454454
     455static void testWebViewRunJavaScript(WebViewTest* test, gconstpointer)
     456{
     457    static const char* html = "<html><body><a id='WebKitLink' href='http://www.webkitgtk.org/' title='WebKitGTK+ Title'>WebKitGTK+ Website</a></body></html>";
     458    test->loadHtml(html, 0);
     459    test->waitUntilLoadFinished();
     460
     461    GOwnPtr<GError> error;
     462    WebKitJavascriptResult* javascriptResult = test->runJavaScriptAndWaitUntilFinished("window.document.getElementById('WebKitLink').title;", &error.outPtr());
     463    g_assert(javascriptResult);
     464    g_assert(!error.get());
     465    GOwnPtr<char> valueString(WebViewTest::javascriptResultToCString(javascriptResult));
     466    g_assert_cmpstr(valueString.get(), ==, "WebKitGTK+ Title");
     467
     468    javascriptResult = test->runJavaScriptAndWaitUntilFinished("window.document.getElementById('WebKitLink').href;", &error.outPtr());
     469    g_assert(javascriptResult);
     470    g_assert(!error.get());
     471    valueString.set(WebViewTest::javascriptResultToCString(javascriptResult));
     472    g_assert_cmpstr(valueString.get(), ==, "http://www.webkitgtk.org/");
     473
     474    javascriptResult = test->runJavaScriptAndWaitUntilFinished("window.document.getElementById('WebKitLink').textContent", &error.outPtr());
     475    g_assert(javascriptResult);
     476    g_assert(!error.get());
     477    valueString.set(WebViewTest::javascriptResultToCString(javascriptResult));
     478    g_assert_cmpstr(valueString.get(), ==, "WebKitGTK+ Website");
     479
     480    javascriptResult = test->runJavaScriptAndWaitUntilFinished("a = 25;", &error.outPtr());
     481    g_assert(javascriptResult);
     482    g_assert(!error.get());
     483    g_assert_cmpfloat(WebViewTest::javascriptResultToNumber(javascriptResult), ==, 25);
     484
     485    javascriptResult = test->runJavaScriptAndWaitUntilFinished("a = 2.5;", &error.outPtr());
     486    g_assert(javascriptResult);
     487    g_assert(!error.get());
     488    g_assert_cmpfloat(WebViewTest::javascriptResultToNumber(javascriptResult), ==, 2.5);
     489
     490    javascriptResult = test->runJavaScriptAndWaitUntilFinished("a = true", &error.outPtr());
     491    g_assert(javascriptResult);
     492    g_assert(!error.get());
     493    g_assert(WebViewTest::javascriptResultToBoolean(javascriptResult));
     494
     495    javascriptResult = test->runJavaScriptAndWaitUntilFinished("a = false", &error.outPtr());
     496    g_assert(javascriptResult);
     497    g_assert(!error.get());
     498    g_assert(!WebViewTest::javascriptResultToBoolean(javascriptResult));
     499
     500    javascriptResult = test->runJavaScriptAndWaitUntilFinished("a = null", &error.outPtr());
     501    g_assert(javascriptResult);
     502    g_assert(!error.get());
     503    g_assert(WebViewTest::javascriptResultIsNull(javascriptResult));
     504
     505    javascriptResult = test->runJavaScriptAndWaitUntilFinished("function Foo() { a = 25; } Foo();", &error.outPtr());
     506    g_assert(javascriptResult);
     507    g_assert(!error.get());
     508    g_assert(WebViewTest::javascriptResultIsUndefined(javascriptResult));
     509
     510    javascriptResult = test->runJavaScriptAndWaitUntilFinished("foo();", &error.outPtr());
     511    g_assert(!javascriptResult);
     512    g_assert_error(error.get(), WEBKIT_JAVASCRIPT_ERROR, WEBKIT_JAVASCRIPT_ERROR_SCRIPT_FAILED);
     513}
     514
    455515void beforeAll()
    456516{
     
    464524    UIClientTest::add("WebKitWebView", "mouse-target", testWebViewMouseTarget);
    465525    WebViewTest::add("WebKitWebView", "zoom-level", testWebViewZoomLevel);
     526    WebViewTest::add("WebKitWebView", "run-javascript", testWebViewRunJavaScript);
    466527}
    467528
  • trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebViewTest.cpp

    r110834 r111510  
    2222#include "WebViewTest.h"
    2323
     24#include <JavaScriptCore/JSRetainPtr.h>
    2425#include <WebCore/GOwnPtrGtk.h>
    2526
     
    2829    , m_mainLoop(g_main_loop_new(0, TRUE))
    2930    , m_parentWindow(0)
     31    , m_javascriptResult(0)
    3032{
    3133    assertObjectIsDeletedWhenTestFinishes(G_OBJECT(m_webView));
     
    3638    if (m_parentWindow)
    3739        gtk_widget_destroy(m_parentWindow);
     40    if (m_javascriptResult)
     41        webkit_javascript_result_unref(m_javascriptResult);
    3842    g_object_unref(m_webView);
    3943    g_main_loop_unref(m_mainLoop);
     
    195199}
    196200
     201static void runJavaScriptReadyCallback(GObject*, GAsyncResult* result, WebViewTest* test)
     202{
     203    test->m_javascriptResult = webkit_web_view_run_javascript_finish(test->m_webView, result, test->m_javascriptError);
     204    g_main_loop_quit(test->m_mainLoop);
     205}
     206
     207WebKitJavascriptResult* WebViewTest::runJavaScriptAndWaitUntilFinished(const char* javascript, GError** error)
     208{
     209    if (m_javascriptResult)
     210        webkit_javascript_result_unref(m_javascriptResult);
     211    m_javascriptResult = 0;
     212    m_javascriptError = error;
     213    webkit_web_view_run_javascript(m_webView, javascript, reinterpret_cast<GAsyncReadyCallback>(runJavaScriptReadyCallback), this);
     214    g_main_loop_run(m_mainLoop);
     215
     216    return m_javascriptResult;
     217}
     218
     219static char* jsValueToCString(JSGlobalContextRef context, JSValueRef value)
     220{
     221    g_assert(value);
     222    g_assert(JSValueIsString(context, value));
     223
     224    JSRetainPtr<JSStringRef> stringValue(Adopt, JSValueToStringCopy(context, value, 0));
     225    g_assert(stringValue);
     226
     227    size_t cStringLength = JSStringGetMaximumUTF8CStringSize(stringValue.get());
     228    char* cString = static_cast<char*>(g_malloc(cStringLength));
     229    JSStringGetUTF8CString(stringValue.get(), cString, cStringLength);
     230    return cString;
     231}
     232
     233char* WebViewTest::javascriptResultToCString(WebKitJavascriptResult* javascriptResult)
     234{
     235    JSGlobalContextRef context = webkit_javascript_result_get_global_context(javascriptResult);
     236    g_assert(context);
     237    return jsValueToCString(context, webkit_javascript_result_get_value(javascriptResult));
     238}
     239
     240double WebViewTest::javascriptResultToNumber(WebKitJavascriptResult* javascriptResult)
     241{
     242    JSGlobalContextRef context = webkit_javascript_result_get_global_context(javascriptResult);
     243    g_assert(context);
     244    JSValueRef value = webkit_javascript_result_get_value(javascriptResult);
     245    g_assert(value);
     246    g_assert(JSValueIsNumber(context, value));
     247
     248    return JSValueToNumber(context, value, 0);
     249}
     250
     251bool WebViewTest::javascriptResultToBoolean(WebKitJavascriptResult* javascriptResult)
     252{
     253    JSGlobalContextRef context = webkit_javascript_result_get_global_context(javascriptResult);
     254    g_assert(context);
     255    JSValueRef value = webkit_javascript_result_get_value(javascriptResult);
     256    g_assert(value);
     257    g_assert(JSValueIsBoolean(context, value));
     258
     259    return JSValueToBoolean(context, value);
     260}
     261
     262bool WebViewTest::javascriptResultIsNull(WebKitJavascriptResult* javascriptResult)
     263{
     264    JSGlobalContextRef context = webkit_javascript_result_get_global_context(javascriptResult);
     265    g_assert(context);
     266    JSValueRef value = webkit_javascript_result_get_value(javascriptResult);
     267    g_assert(value);
     268
     269    return JSValueIsNull(context, value);
     270}
     271
     272bool WebViewTest::javascriptResultIsUndefined(WebKitJavascriptResult* javascriptResult)
     273{
     274    JSGlobalContextRef context = webkit_javascript_result_get_global_context(javascriptResult);
     275    g_assert(context);
     276    JSValueRef value = webkit_javascript_result_get_value(javascriptResult);
     277    g_assert(value);
     278
     279    return JSValueIsUndefined(context, value);
     280}
     281
  • trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebViewTest.h

    r109120 r111510  
    4949    void mouseMoveTo(int x, int y, unsigned int mouseModifiers = 0);
    5050
     51    WebKitJavascriptResult* runJavaScriptAndWaitUntilFinished(const char* javascript, GError**);
     52
     53    // Javascript result helpers.
     54    static char* javascriptResultToCString(WebKitJavascriptResult*);
     55    static double javascriptResultToNumber(WebKitJavascriptResult*);
     56    static bool javascriptResultToBoolean(WebKitJavascriptResult*);
     57    static bool javascriptResultIsNull(WebKitJavascriptResult*);
     58    static bool javascriptResultIsUndefined(WebKitJavascriptResult*);
     59
    5160    WebKitWebView* m_webView;
    5261    GMainLoop* m_mainLoop;
     
    5463    GtkWidget* m_parentWindow;
    5564    CString m_expectedTitle;
     65    WebKitJavascriptResult* m_javascriptResult;
     66    GError** m_javascriptError;
    5667};
    5768
  • trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h

    r109880 r111510  
    3333#include <webkit2/WebKitFindController.h>
    3434#include <webkit2/WebKitHitTestResult.h>
     35#include <webkit2/WebKitJavascriptResult.h>
    3536#include <webkit2/WebKitPrintOperation.h>
    3637#include <webkit2/WebKitScriptDialog.h>
  • trunk/Tools/ChangeLog

    r111504 r111510  
     12012-03-21  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Add webkit_web_view_run_javascript() to WebKit2 GTK+
     4        https://bugs.webkit.org/show_bug.cgi?id=75543
     5
     6        Reviewed by Martin Robinson.
     7
     8        * MiniBrowser/gtk/GNUmakefile.am: Add javascriptcore_cppflags to
     9        MiniBrowser CPP flags.
     10
    1112012-03-20  Eric Seidel  <eric@webkit.org>
    212
  • trunk/Tools/MiniBrowser/gtk/GNUmakefile.am

    r108222 r111510  
    1111        -DWEBKIT_EXEC_PATH=\"${shell pwd}/$(top_builddir)/Programs/\" \
    1212        $(global_cppflags) \
     13        $(javascriptcore_cppflags) \
    1314        $(GLIB_CFLAGS) \
    1415        $(GTK_CFLAGS)
Note: See TracChangeset for help on using the changeset viewer.