[evolution/wip/mcrha/webkit-jsc-api] Begun to use already defined jsc functions in EWebView



commit b00fded05574075b2f77b79baea1701e420b7848
Author: Milan Crha <mcrha redhat com>
Date:   Fri Sep 27 08:49:43 2019 +0200

    Begun to use already defined jsc functions in EWebView

 src/e-util/e-web-view-jsc-utils.c | 260 +++++++++++++++++++++-----------------
 src/e-util/e-web-view-jsc-utils.h |  12 +-
 src/e-util/e-web-view.c           |  95 +++-----------
 src/e-util/e-web-view.h           |   6 +-
 src/e-util/test-web-view.c        |  18 +--
 src/mail/e-mail-display.c         |   2 +-
 src/web-extensions/ext-utils.js   |  35 ++++-
 7 files changed, 213 insertions(+), 215 deletions(-)
---
diff --git a/src/e-util/e-web-view-jsc-utils.c b/src/e-util/e-web-view-jsc-utils.c
index 6cb4e99e9c..2a3e37a713 100644
--- a/src/e-util/e-web-view-jsc-utils.c
+++ b/src/e-util/e-web-view-jsc-utils.c
@@ -21,90 +21,6 @@
 
 #include "e-web-view-jsc-utils.h"
 
-gchar *
-e_web_view_jsc_strdup_call (const gchar *call_format,
-                           ...)
-{
-       GString *script;
-       const gchar *ptr;
-       va_list va;
-
-       g_return_val_if_fail (call_format != NULL, NULL);
-
-       script = g_string_sized_new (128);
-       va_start (va, call_format);
-
-       for (ptr = call_format; *ptr; ptr++) {
-               if (*ptr == '\\') {
-                       g_warn_if_fail (ptr[1]);
-
-                       g_string_append_c (script, ptr[0]);
-                       g_string_append_c (script, ptr[1]);
-
-                       ptr++;
-               } else if (*ptr == '%') {
-                       g_warn_if_fail (ptr[1]);
-
-                       switch (ptr[1]) {
-                       case '%':
-                               g_string_append_c (script, ptr[1]);
-                               break;
-                       case 's': {
-                               const gchar *arg = va_arg (va, const gchar *);
-
-                               /* Enclose strings into double-quotes */
-                               g_string_append_c (script, '\"');
-
-                               /* Escape significant characters */
-                               if (arg && (strchr (arg, '\"') ||
-                                   strchr (arg, '\\') ||
-                                   strchr (arg, '\n') ||
-                                   strchr (arg, '\r') ||
-                                   strchr (arg, '\t'))) {
-                                       const gchar *ptr2;
-
-                                       for (ptr2 = arg; *ptr2; ptr2++) {
-                                               if (*ptr2 == '\\')
-                                                       g_string_append (script, "\\\\");
-                                               else if (*ptr2 == '\"')
-                                                       g_string_append (script, "\\\"");
-                                               else if (*ptr2 == '\r')
-                                                       g_string_append (script, "\\r");
-                                               else if (*ptr2 == '\n')
-                                                       g_string_append (script, "\\n");
-                                               else if (*ptr2 == '\t')
-                                                       g_string_append (script, "\\t");
-                                               else
-                                                       g_string_append_c (script, *ptr2);
-                                       }
-                               } else if (arg && *arg) {
-                                       g_string_append (script, arg);
-                               }
-
-                               g_string_append_c (script, '\"');
-
-                               } break;
-                       case 'd': {
-                               gint arg = va_arg (va, gint);
-
-                               g_string_append_printf (script, "%d", arg);
-                               } break;
-                       default:
-                               g_warning ("%s: Unknown percent tag '%c'", G_STRFUNC, *ptr);
-                               break;
-                       }
-
-                       ptr++;
-               } else {
-                       g_string_append_c (script, *ptr);
-               }
-       }
-
-       va_end (va);
-
-       return g_string_free (script, FALSE);
-}
-
 gboolean
 e_web_view_jsc_get_object_property_boolean (JSCValue *jsc_object,
                                            const gchar *property_name,
@@ -199,6 +115,112 @@ e_web_view_jsc_get_object_property_string (JSCValue *jsc_object,
        return res;
 }
 
+gchar *
+e_web_view_jsc_printf_script (const gchar *script_format,
+                             ...)
+{
+       gchar *script;
+       va_list va;
+
+       g_return_val_if_fail (script_format != NULL, NULL);
+
+       va_start (va, script_format);
+       script = e_web_view_jsc_printf_scriptv (script_format, va);
+       va_end (va);
+
+       return script;
+}
+
+gchar *
+e_web_view_jsc_printf_scriptv (const gchar *script_format,
+                              va_list va)
+{
+       GString *script;
+       const gchar *ptr;
+
+       g_return_val_if_fail (script_format != NULL, NULL);
+
+       script = g_string_sized_new (128);
+
+       for (ptr = script_format; *ptr; ptr++) {
+               if (*ptr == '\\') {
+                       g_warn_if_fail (ptr[1]);
+
+                       g_string_append_c (script, ptr[0]);
+                       g_string_append_c (script, ptr[1]);
+
+                       ptr++;
+               } else if (*ptr == '%') {
+                       g_warn_if_fail (ptr[1]);
+
+                       switch (ptr[1]) {
+                       case '%':
+                               g_string_append_c (script, ptr[1]);
+                               break;
+                       case 'b': {
+                               gboolean arg = va_arg (va, gboolean);
+
+                               g_string_append (script, arg ? "true" : "false");
+                               } break;
+                       case 'd': {
+                               gint arg = va_arg (va, gint);
+
+                               g_string_append_printf (script, "%d", arg);
+                               } break;
+                       case 'f': {
+                               gdouble arg = va_arg (va, gdouble);
+
+                               g_string_append_printf (script, "%f", arg);
+                               } break;
+                       case 's': {
+                               const gchar *arg = va_arg (va, const gchar *);
+
+                               /* Enclose strings into double-quotes */
+                               g_string_append_c (script, '\"');
+
+                               /* Escape significant characters */
+                               if (arg && (strchr (arg, '\"') ||
+                                   strchr (arg, '\\') ||
+                                   strchr (arg, '\n') ||
+                                   strchr (arg, '\r') ||
+                                   strchr (arg, '\t'))) {
+                                       const gchar *ptr2;
+
+                                       for (ptr2 = arg; *ptr2; ptr2++) {
+                                               if (*ptr2 == '\\')
+                                                       g_string_append (script, "\\\\");
+                                               else if (*ptr2 == '\"')
+                                                       g_string_append (script, "\\\"");
+                                               else if (*ptr2 == '\r')
+                                                       g_string_append (script, "\\r");
+                                               else if (*ptr2 == '\n')
+                                                       g_string_append (script, "\\n");
+                                               else if (*ptr2 == '\t')
+                                                       g_string_append (script, "\\t");
+                                               else
+                                                       g_string_append_c (script, *ptr2);
+                                       }
+                               } else if (arg && *arg) {
+                                       g_string_append (script, arg);
+                               }
+
+                               g_string_append_c (script, '\"');
+
+                               } break;
+                       default:
+                               g_warning ("%s: Unknown percent tag '%c'", G_STRFUNC, *ptr);
+                               break;
+                       }
+
+                       ptr++;
+               } else {
+                       g_string_append_c (script, *ptr);
+               }
+       }
+
+       return g_string_free (script, FALSE);
+}
+
 static void
 ewv_jsc_call_done_cb (GObject *source,
                      GAsyncResult *result,
@@ -211,8 +233,11 @@ ewv_jsc_call_done_cb (GObject *source,
        js_result = webkit_web_view_run_javascript_finish (WEBKIT_WEB_VIEW (source), result, &error);
 
        if (error) {
-               if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
-                       g_warning ("Failed to call '%s' function: %s", script, error->message);
+               if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) &&
+                   (!g_error_matches (error, WEBKIT_JAVASCRIPT_ERROR, WEBKIT_JAVASCRIPT_ERROR_SCRIPT_FAILED) 
||
+                    /* WebKit can return empty error message, thus ignore those. */
+                    (error->message && *(error->message))))
+                       g_warning ("Failed to call '%s' function: %s:%d: %s", script, g_quark_to_string 
(error->domain), error->code, error->message);
                g_clear_error (&error);
        }
 
@@ -232,6 +257,25 @@ ewv_jsc_call_done_cb (GObject *source,
        g_free (script);
 }
 
+void
+e_web_view_jsc_run_script (WebKitWebView *web_view,
+                          GCancellable *cancellable,
+                          const gchar *script_format,
+                          ...)
+{
+       gchar *script;
+       va_list va;
+
+       g_return_if_fail (WEBKIT_IS_WEB_VIEW (web_view));
+       g_return_if_fail (script_format != NULL);
+
+       va_start (va, script_format);
+       script = e_web_view_jsc_printf_scriptv (script_format, va);
+       va_end (va);
+
+       webkit_web_view_run_javascript (web_view, script, cancellable, ewv_jsc_call_done_cb, script);
+}
+
 void
 e_web_view_jsc_set_element_hidden (WebKitWebView *web_view,
                                   const gchar *iframe_id,
@@ -239,17 +283,14 @@ e_web_view_jsc_set_element_hidden (WebKitWebView *web_view,
                                   gboolean value,
                                   GCancellable *cancellable)
 {
-       gchar *script;
-
        g_return_if_fail (WEBKIT_IS_WEB_VIEW (web_view));
        g_return_if_fail (element_id != NULL);
 
-       script = e_web_view_jsc_strdup_call ("Evo.SetElementHidden(%s,%s,%d)",
+       e_web_view_jsc_run_script (web_view, cancellable,
+               "Evo.SetElementHidden(%s,%s,%d)",
                iframe_id,
                element_id,
                value ? 1 : 0);
-
-       webkit_web_view_run_javascript (web_view, script, cancellable, ewv_jsc_call_done_cb, script);
 }
 
 void
@@ -260,19 +301,16 @@ e_web_view_jsc_set_element_style_property (WebKitWebView *web_view,
                                           const gchar *value,
                                           GCancellable *cancellable)
 {
-       gchar *script;
-
        g_return_if_fail (WEBKIT_IS_WEB_VIEW (web_view));
        g_return_if_fail (element_id != NULL);
        g_return_if_fail (property_name != NULL);
 
-       script = e_web_view_jsc_strdup_call ("Evo.SetElementStyleProperty(%s,%s,%s,%s)",
+       e_web_view_jsc_run_script (web_view, cancellable,
+               "Evo.SetElementStyleProperty(%s,%s,%s,%s)",
                iframe_id,
                element_id,
                property_name,
                value);
-
-       webkit_web_view_run_javascript (web_view, script, cancellable, ewv_jsc_call_done_cb, script);
 }
 
 void
@@ -284,20 +322,17 @@ e_web_view_jsc_set_element_attribute (WebKitWebView *web_view,
                                      const gchar *value,
                                      GCancellable *cancellable)
 {
-       gchar *script;
-
        g_return_if_fail (WEBKIT_IS_WEB_VIEW (web_view));
        g_return_if_fail (element_id != NULL);
        g_return_if_fail (qualified_name != NULL);
 
-       script = e_web_view_jsc_strdup_call ("Evo.SetElementAttribute(%s,%s,%s,%s,%s)",
+       e_web_view_jsc_run_script (web_view, cancellable,
+               "Evo.SetElementAttribute(%s,%s,%s,%s,%s)",
                iframe_id,
                element_id,
                namespace_uri,
                qualified_name,
                value);
-
-       webkit_web_view_run_javascript (web_view, script, cancellable, ewv_jsc_call_done_cb, script);
 }
 
 void
@@ -307,17 +342,14 @@ e_web_view_jsc_create_css_style_sheet (WebKitWebView *web_view,
                                       const gchar *content,
                                       GCancellable *cancellable)
 {
-       gchar *script;
-
        g_return_if_fail (WEBKIT_IS_WEB_VIEW (web_view));
        g_return_if_fail (style_sheet_id != NULL);
 
-       script = e_web_view_jsc_strdup_call ("Evo.CreateCSSStyleSheet(%s,%s,%s)",
+       e_web_view_jsc_run_script (web_view, cancellable,
+               "Evo.CreateCSSStyleSheet(%s,%s,%s)",
                iframe_id,
                style_sheet_id,
                content);
-
-       webkit_web_view_run_javascript (web_view, script, cancellable, ewv_jsc_call_done_cb, script);
 }
 
 void
@@ -328,18 +360,15 @@ e_web_view_jsc_add_css_rule_into_style_sheet (WebKitWebView *web_view,
                                              const gchar *style,
                                              GCancellable *cancellable)
 {
-       gchar *script;
-
        g_return_if_fail (WEBKIT_IS_WEB_VIEW (web_view));
        g_return_if_fail (style_sheet_id != NULL);
 
-       script = e_web_view_jsc_strdup_call ("Evo.AddCSSRuleIntoStyleSheet(%s,%s,%s,%s)",
+       e_web_view_jsc_run_script (web_view, cancellable,
+               "Evo.AddCSSRuleIntoStyleSheet(%s,%s,%s,%s)",
                iframe_id,
                style_sheet_id,
                selector,
                style);
-
-       webkit_web_view_run_javascript (web_view, script, cancellable, ewv_jsc_call_done_cb, script);
 }
 
 void
@@ -348,16 +377,13 @@ e_web_view_jsc_register_element_clicked (WebKitWebView *web_view,
                                         const gchar *elem_classes,
                                         GCancellable *cancellable)
 {
-       gchar *script;
-
        g_return_if_fail (WEBKIT_IS_WEB_VIEW (web_view));
        g_return_if_fail (elem_classes != NULL);
 
-       script = e_web_view_jsc_strdup_call ("Evo.RegisterElementClicked(%s,%s)",
+       e_web_view_jsc_run_script (web_view, cancellable,
+               "Evo.RegisterElementClicked(%s,%s)",
                iframe_id,
                elem_classes);
-
-       webkit_web_view_run_javascript (web_view, script, cancellable, ewv_jsc_call_done_cb, script);
 }
 
 void
@@ -371,7 +397,7 @@ e_web_view_jsc_get_selection (WebKitWebView *web_view,
 
        g_return_if_fail (WEBKIT_IS_WEB_VIEW (web_view));
 
-       script = e_web_view_jsc_strdup_call ("Evo.GetSelection(%d)", format);
+       script = e_web_view_jsc_printf_script ("Evo.GetSelection(%d)", format);
 
        webkit_web_view_run_javascript (web_view, script, cancellable, callback, user_data);
 
diff --git a/src/e-util/e-web-view-jsc-utils.h b/src/e-util/e-web-view-jsc-utils.h
index aefc453af2..7351256870 100644
--- a/src/e-util/e-web-view-jsc-utils.h
+++ b/src/e-util/e-web-view-jsc-utils.h
@@ -26,9 +26,6 @@
 
 G_BEGIN_DECLS
 
-gchar *                e_web_view_jsc_strdup_call      (const gchar *call_format,
-                                                ...) G_GNUC_PRINTF (1, 2);
-
 gboolean       e_web_view_jsc_get_object_property_boolean
                                                (JSCValue *jsc_object,
                                                 const gchar *property_name,
@@ -46,6 +43,15 @@ gchar *              e_web_view_jsc_get_object_property_string
                                                 const gchar *property_name,
                                                 const gchar *default_value);
 
+gchar *                e_web_view_jsc_printf_script    (const gchar *script_format,
+                                                ...) G_GNUC_PRINTF (1, 2);
+gchar *                e_web_view_jsc_printf_scriptv   (const gchar *script_format,
+                                                va_list va);
+void           e_web_view_jsc_run_script       (WebKitWebView *web_view,
+                                                GCancellable *cancellable,
+                                                const gchar *script_format,
+                                                ...) G_GNUC_PRINTF (3, 4);
+
 void           e_web_view_jsc_set_element_hidden
                                                (WebKitWebView *web_view,
                                                 const gchar *iframe_id,
diff --git a/src/e-util/e-web-view.c b/src/e-util/e-web-view.c
index 9dddfded08..86c2feb702 100644
--- a/src/e-util/e-web-view.c
+++ b/src/e-util/e-web-view.c
@@ -744,21 +744,6 @@ web_view_decide_policy_cb (EWebView *web_view,
        return TRUE;
 }
 
-static void
-e_web_view_ensure_body_class (EWebView *web_view)
-{
-       guint64 page_id;
-
-       g_return_if_fail (E_IS_WEB_VIEW (web_view));
-
-       page_id = webkit_web_view_get_page_id (WEBKIT_WEB_VIEW (web_view));
-
-       e_web_extension_container_call_simple (web_view->priv->container,
-               page_id, web_view->priv->stamp,
-               "EWebViewEnsureBodyClass",
-               g_variant_new ("(ts)", page_id, "-e-web-view-background-color -e-web-view-text-color"));
-}
-
 static void
 style_updated_cb (EWebView *web_view)
 {
@@ -826,7 +811,9 @@ web_view_load_changed_cb (WebKitWebView *webkit_web_view,
        if (load_event != WEBKIT_LOAD_FINISHED)
                return;
 
-       e_web_view_ensure_body_class (web_view);
+       /* Make sure the initialize function is called for the top document when it is loaded. */
+       e_web_view_jsc_run_script (webkit_web_view, web_view->priv->load_cancellable,
+               "Evo.InitializeAndPostContentLoaded(null);");
        style_updated_cb (web_view);
 
        web_view_update_document_highlights (web_view);
@@ -1049,6 +1036,9 @@ web_view_dispose (GObject *object)
 {
        EWebViewPrivate *priv;
 
+       /* This can be called during dispose, thus disconnect early */
+       g_signal_handlers_disconnect_by_func (object, G_CALLBACK (style_updated_cb), NULL);
+
        priv = E_WEB_VIEW_GET_PRIVATE (object);
 
        if (priv->load_cancellable) {
@@ -1828,7 +1818,6 @@ e_web_view_page_proxy_changed_cb (EWebExtensionContainer *container,
                e_web_view_set_web_extension_proxy (web_view, proxy);
 
                if (proxy) {
-                       e_web_view_ensure_body_class (web_view);
                        style_updated_cb (web_view);
                }
        }
@@ -4513,31 +4502,6 @@ e_web_view_request_finish (EWebView *web_view,
        return g_object_ref (async_context->input_stream);
 }
 
-/**
- * e_web_view_create_and_add_css_style_sheet:
- * @web_view: an #EWebView
- * @style_sheet_id: CSS style sheet's id
- *
- * Creates new CSS style sheet with given @style_sheel_id and inserts
- * it into given @web_view document.
- **/
-void
-e_web_view_create_and_add_css_style_sheet (EWebView *web_view,
-                                           const gchar *style_sheet_id)
-{
-       guint64 page_id;
-
-       g_return_if_fail (E_IS_WEB_VIEW (web_view));
-       g_return_if_fail (style_sheet_id && *style_sheet_id);
-
-       page_id = webkit_web_view_get_page_id (WEBKIT_WEB_VIEW (web_view));
-
-       e_web_extension_container_call_simple (web_view->priv->container,
-               page_id, web_view->priv->stamp,
-               "CreateAndAddCSSStyleSheet",
-               g_variant_new ("(ts)", page_id, style_sheet_id));
-}
-
 /**
  * e_web_view_add_css_rule_into_style_sheet:
  * @web_view: an #EWebView
@@ -4557,19 +4521,14 @@ e_web_view_add_css_rule_into_style_sheet (EWebView *web_view,
                                           const gchar *selector,
                                           const gchar *style)
 {
-       guint64 page_id;
-
        g_return_if_fail (E_IS_WEB_VIEW (web_view));
        g_return_if_fail (style_sheet_id && *style_sheet_id);
        g_return_if_fail (selector && *selector);
        g_return_if_fail (style && *style);
 
-       page_id = webkit_web_view_get_page_id (WEBKIT_WEB_VIEW (web_view));
-
-       e_web_extension_container_call_simple (web_view->priv->container,
-               page_id, web_view->priv->stamp,
-               "AddCSSRuleIntoStyleSheet",
-               g_variant_new ("(tsss)", page_id, style_sheet_id, selector, style));
+       e_web_view_jsc_add_css_rule_into_style_sheet (WEBKIT_WEB_VIEW (web_view),
+               "", style_sheet_id, selector, style,
+               web_view->priv->load_cancellable);
 }
 
 /**
@@ -4794,38 +4753,27 @@ e_web_view_set_element_hidden (EWebView *web_view,
                               const gchar *element_id,
                               gboolean hidden)
 {
-       guint64 page_id;
-
        g_return_if_fail (E_IS_WEB_VIEW (web_view));
        g_return_if_fail (element_id && *element_id);
 
-       page_id = webkit_web_view_get_page_id (WEBKIT_WEB_VIEW (web_view));
-
-       e_web_extension_container_call_simple (web_view->priv->container,
-               page_id, web_view->priv->stamp,
-               "SetElementHidden",
-               g_variant_new ("(tsb)", page_id, element_id, hidden));
+       e_web_view_jsc_set_element_hidden (WEBKIT_WEB_VIEW (web_view),
+               "*", element_id, hidden,
+               web_view->priv->load_cancellable);
 }
 
 void
 e_web_view_set_element_style_property (EWebView *web_view,
                                       const gchar *element_id,
                                       const gchar *property_name,
-                                      const gchar *value,
-                                      const gchar *priority)
+                                      const gchar *value)
 {
-       guint64 page_id;
-
        g_return_if_fail (E_IS_WEB_VIEW (web_view));
        g_return_if_fail (element_id && *element_id);
        g_return_if_fail (property_name && *property_name);
 
-       page_id = webkit_web_view_get_page_id (WEBKIT_WEB_VIEW (web_view));
-
-       e_web_extension_container_call_simple (web_view->priv->container,
-               page_id, web_view->priv->stamp,
-               "SetElementStyleProperty",
-               g_variant_new ("(tssss)", page_id, element_id, property_name, value ? value : "", priority ? 
priority : ""));
+       e_web_view_jsc_set_element_style_property (WEBKIT_WEB_VIEW (web_view),
+               "*", element_id, property_name, value,
+               web_view->priv->load_cancellable);
 }
 
 void
@@ -4835,16 +4783,11 @@ e_web_view_set_element_attribute (EWebView *web_view,
                                  const gchar *qualified_name,
                                  const gchar *value)
 {
-       guint64 page_id;
-
        g_return_if_fail (E_IS_WEB_VIEW (web_view));
        g_return_if_fail (element_id && *element_id);
        g_return_if_fail (qualified_name && *qualified_name);
 
-       page_id = webkit_web_view_get_page_id (WEBKIT_WEB_VIEW (web_view));
-
-       e_web_extension_container_call_simple (web_view->priv->container,
-               page_id, web_view->priv->stamp,
-               "SetElementAttribute",
-               g_variant_new ("(tssss)", page_id, element_id, namespace_uri ? namespace_uri : "", 
qualified_name, value ? value : ""));
+       e_web_view_jsc_set_element_attribute (WEBKIT_WEB_VIEW (web_view),
+               "*", element_id, namespace_uri, qualified_name, value,
+               web_view->priv->load_cancellable);
 }
diff --git a/src/e-util/e-web-view.h b/src/e-util/e-web-view.h
index 5d2d66eede..f98f43fa04 100644
--- a/src/e-util/e-web-view.h
+++ b/src/e-util/e-web-view.h
@@ -267,9 +267,6 @@ GInputStream *      e_web_view_request_finish       (EWebView *web_view,
 void           e_web_view_install_request_handler
                                                (EWebView *web_view,
                                                 GType handler_type);
-void           e_web_view_create_and_add_css_style_sheet
-                                               (EWebView *web_view,
-                                                const gchar *style_sheet_id);
 void           e_web_view_add_css_rule_into_style_sheet
                                                (EWebView *web_view,
                                                 const gchar *style_sheet_id,
@@ -302,8 +299,7 @@ void                e_web_view_set_element_style_property
                                                (EWebView *web_view,
                                                 const gchar *element_id,
                                                 const gchar *property_name,
-                                                const gchar *value,
-                                                const gchar *priority);
+                                                const gchar *value);
 void           e_web_view_set_element_attribute
                                                (EWebView *web_view,
                                                 const gchar *element_id,
diff --git a/src/e-util/test-web-view.c b/src/e-util/test-web-view.c
index c1af5516a4..bbbc78947b 100644
--- a/src/e-util/test-web-view.c
+++ b/src/e-util/test-web-view.c
@@ -427,7 +427,7 @@ test_utils_load_iframe_content (TestFixture *fixture,
        handler_id = g_signal_connect (fixture->web_view, "content-loaded",
                G_CALLBACK (test_utils_iframe_loaded_cb), fixture);
 
-       script = e_web_view_jsc_strdup_call ("Evo.SetIFrameContent(%s,%s)", iframe_id, content);
+       script = e_web_view_jsc_printf_script ("Evo.SetIFrameContent(%s,%s)", iframe_id, content);
 
        test_utils_jsc_call (fixture, script);
 
@@ -518,7 +518,7 @@ test_jsc_object_properties (TestFixture *fixture)
        JSCValue *jsc_object = NULL;
        gchar *str;
 
-       str = e_web_view_jsc_strdup_call (
+       str = e_web_view_jsc_printf_script (
                "test_obj_props = function()\n"
                "{\n"
                "       var arrobj = [];\n"
@@ -772,7 +772,7 @@ test_style_sheets (TestFixture *fixture)
                NULL);
 
        g_assert_cmpint (1, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"\")"));
-       g_assert_cmpint (1, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"frm1\")"));
+       g_assert_cmpint (0, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"frm1\")"));
        g_assert_cmpint (0, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"frm1_1\")"));
        g_assert_cmpint (0, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"frm2\")"));
        test_utils_jsc_call_string_and_verify (fixture, "Test.getStyle(\"\", \"sheet1\", \"body\", 
\"color\")", NULL);
@@ -781,7 +781,7 @@ test_style_sheets (TestFixture *fixture)
        test_utils_wait_noop (fixture);
 
        g_assert_cmpint (2, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"\")"));
-       g_assert_cmpint (1, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"frm1\")"));
+       g_assert_cmpint (0, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"frm1\")"));
        g_assert_cmpint (0, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"frm1_1\")"));
        g_assert_cmpint (0, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"frm2\")"));
        test_utils_jsc_call_string_and_verify (fixture, "Test.getStyle(\"\", \"sheet1\", \"body\", 
\"color\")", "green");
@@ -791,7 +791,7 @@ test_style_sheets (TestFixture *fixture)
        test_utils_wait_noop (fixture);
 
        g_assert_cmpint (2, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"\")"));
-       g_assert_cmpint (1, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"frm1\")"));
+       g_assert_cmpint (0, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"frm1\")"));
        g_assert_cmpint (1, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"frm1_1\")"));
        g_assert_cmpint (0, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"frm2\")"));
        test_utils_jsc_call_string_and_verify (fixture, "Test.getStyle(\"\", \"sheet1\", \"body\", 
\"color\")", "green");
@@ -805,7 +805,7 @@ test_style_sheets (TestFixture *fixture)
        test_utils_wait_noop (fixture);
 
        g_assert_cmpint (3, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"\")"));
-       g_assert_cmpint (2, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"frm1\")"));
+       g_assert_cmpint (1, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"frm1\")"));
        g_assert_cmpint (2, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"frm1_1\")"));
        g_assert_cmpint (1, ==, test_utils_jsc_call_int32_sync (fixture, "Test.nStyles(\"frm2\")"));
        test_utils_jsc_call_string_and_verify (fixture, "Test.getStyle(\"\", \"sheet1\", \"body\", 
\"color\")", "green");
@@ -864,7 +864,7 @@ test_verify_element_clicked (TestFixture *fixture,
        expects->element_class = element_class;
        expects->element_value = element_value;
 
-       script = e_web_view_jsc_strdup_call ("Evo.findIFrameDocument(%s).getElementById(%s).click();",
+       script = e_web_view_jsc_printf_script ("Evo.findIFrameDocument(%s).getElementById(%s).click();",
                iframe_id, element_id);
 
        test_utils_jsc_call (fixture, script);
@@ -978,7 +978,7 @@ test_verify_need_input (TestFixture *fixture,
        if (iframe_id) {
                gchar *script;
 
-               script = e_web_view_jsc_strdup_call ("Evo.findIFrameDocument(%s).getElementById(%s).focus();",
+               script = e_web_view_jsc_printf_script 
("Evo.findIFrameDocument(%s).getElementById(%s).focus();",
                        iframe_id, element_id);
 
                test_utils_jsc_call (fixture, script);
@@ -1057,7 +1057,7 @@ test_selection_select_in_iframe (TestFixture *fixture,
 {
        gchar *script;
 
-       script = e_web_view_jsc_strdup_call (
+       script = e_web_view_jsc_printf_script (
                /* Clean selection in both places first, otherwise the previous selection
                   can stay when changing it only in one of them. */
                "Evo.findIFrameDocument(\"\").defaultView.getSelection().empty();\n"
diff --git a/src/mail/e-mail-display.c b/src/mail/e-mail-display.c
index 0a18d284da..9257d9fd61 100644
--- a/src/mail/e-mail-display.c
+++ b/src/mail/e-mail-display.c
@@ -749,7 +749,7 @@ mail_attachment_change_zoom (EMailDisplay *display,
 
                element_id = g_strdup_printf ("attachment-wrapper-%p::child", attachment);
 
-               e_web_view_set_element_style_property (E_WEB_VIEW (display), element_id, "max-width", 
max_width, "");
+               e_web_view_set_element_style_property (E_WEB_VIEW (display), element_id, "max-width", 
max_width);
 
                g_free (element_id);
        }
diff --git a/src/web-extensions/ext-utils.js b/src/web-extensions/ext-utils.js
index ab083b2547..321b80b518 100644
--- a/src/web-extensions/ext-utils.js
+++ b/src/web-extensions/ext-utils.js
@@ -44,6 +44,28 @@ Evo.findIFrameDocument = function(iframe_id)
        return document;
 }
 
+Evo.findElementInDocument = function(doc, element_id)
+{
+       var elem, iframes, ii;
+
+       if (!doc)
+               return null;
+
+       elem = doc.getElementById(element_id);
+       if (elem)
+               return elem;
+
+       iframes = doc.getElementsByTagName("iframe");
+
+       for (ii = 0; ii < iframes.length; ii++) {
+               elem = Evo.findElementInDocument(iframes[ii].contentDocument, element_id);
+               if (elem)
+                       return elem;
+       }
+
+       return null;
+}
+
 Evo.findElement = function(iframe_id, element_id)
 {
        var iframe;
@@ -51,6 +73,10 @@ Evo.findElement = function(iframe_id, element_id)
        if (iframe_id == "")
                return document.getElementById(element_id);
 
+       if (iframe_id == "*") {
+               return Evo.findElementInDocument(document, element_id);
+       }
+
        iframe = Evo.findIFrame(iframe_id);
 
        if (!iframe)
@@ -136,9 +162,9 @@ Evo.addCSSRuleIntoStyleSheetDocument = function(doc, style_sheet_id, selector, s
                return;
        }
 
-       for (ii = 0; ii < style.cssRules.length; ii++) {
-               if (style.cssRules[ii].selectorText == selector) {
-                       style.cssRules[ii].style.cssText = style;
+       for (ii = 0; ii < styleobj.sheet.cssRules.length; ii++) {
+               if (styleobj.sheet.cssRules[ii].selectorText == selector) {
+                       styleobj.sheet.cssRules[ii].style.cssText = style;
                        return;
                }
        }
@@ -421,9 +447,10 @@ Evo.InitializeAndPostContentLoaded = function(elem)
        window.webkit.messageHandlers.contentLoaded.postMessage(iframe_id);
 }
 
+
 if (this instanceof Window && this.document) {
        this.document.onload = function() { Evo.InitializeAndPostContentLoaded(this); };
 
-       if (this.document.body.firstChild)
+       if (this.document.body && this.document.body.firstChild)
                Evo.InitializeAndPostContentLoaded(this.document);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]