[evolution] Fix various leaks of WebKit DOM objects



commit fb44dc646f69e5d910386834a205a86b5206bd2b
Author: Tomas Popela <tpopela redhat com>
Date:   Wed Mar 25 12:08:25 2015 +0100

    Fix various leaks of WebKit DOM objects
    
    Specifically WebKitDOMDOMWindow, WebKitDOMDOMSelection, WebKitDOMRange and
    WebKitDOMCSSStyleDeclaration objects

 e-util/e-html-editor-actions.c            |   13 +-
 e-util/e-html-editor-link-dialog.c        |   19 ++-
 e-util/e-html-editor-selection.c          |  294 ++++++++++++++++++++---------
 e-util/e-html-editor-spell-check-dialog.c |   10 +-
 e-util/e-html-editor-table-dialog.c       |   16 +-
 e-util/e-html-editor-view.c               |  244 +++++++++++++++++++-----
 e-util/e-web-view.c                       |   17 +-
 7 files changed, 449 insertions(+), 164 deletions(-)
---
diff --git a/e-util/e-html-editor-actions.c b/e-util/e-html-editor-actions.c
index db271fa..d0f8900 100644
--- a/e-util/e-html-editor-actions.c
+++ b/e-util/e-html-editor-actions.c
@@ -538,25 +538,32 @@ action_cut_cb (GtkAction *action,
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
        dom_window = webkit_dom_document_get_default_view (document);
        dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
 
-       if (!webkit_dom_dom_selection_get_range_count (dom_selection))
+       if (!webkit_dom_dom_selection_get_range_count (dom_selection)) {
+               g_object_unref (dom_selection);
                return;
+       }
 
        selection = e_html_editor_view_get_selection (view);
 
        ev = g_new0 (EHTMLEditorViewHistoryEvent, 1);
        ev->type = HISTORY_DELETE;
 
-       range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
        e_html_editor_selection_get_selection_coordinates (
                selection, &ev->before.start.x, &ev->before.start.y, &ev->before.end.x, &ev->before.end.y);
        range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
 
-       if (webkit_dom_range_get_collapsed (range, NULL))
+       if (webkit_dom_range_get_collapsed (range, NULL)) {
+               g_object_unref (range);
+               g_object_unref (dom_selection);
                return;
+       }
 
        /* Save the fragment. */
        fragment = webkit_dom_range_clone_contents (range, NULL);
+       g_object_unref (range);
+       g_object_unref (dom_selection);
        ev->data.fragment = g_object_ref (fragment);
 
        webkit_web_view_cut_clipboard (WEBKIT_WEB_VIEW (view));
diff --git a/e-util/e-html-editor-link-dialog.c b/e-util/e-html-editor-link-dialog.c
index 697c1f0..2415868 100644
--- a/e-util/e-html-editor-link-dialog.c
+++ b/e-util/e-html-editor-link-dialog.c
@@ -106,7 +106,7 @@ html_editor_link_dialog_ok (EHTMLEditorLinkDialog *dialog)
        EHTMLEditorView *view;
        EHTMLEditorSelection *selection;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMWindow *dom_window;
        WebKitDOMDOMSelection *dom_selection;
        WebKitDOMRange *range;
        WebKitDOMElement *link;
@@ -116,12 +116,14 @@ html_editor_link_dialog_ok (EHTMLEditorLinkDialog *dialog)
        selection = e_html_editor_view_get_selection (view);
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
-       window = webkit_dom_document_get_default_view (document);
-       dom_selection = webkit_dom_dom_window_get_selection (window);
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
 
        if (!dom_selection ||
            (webkit_dom_dom_selection_get_range_count (dom_selection) == 0)) {
                gtk_widget_hide (GTK_WIDGET (dialog));
+               g_object_unref (dom_selection);
                return;
        }
 
@@ -198,6 +200,8 @@ html_editor_link_dialog_ok (EHTMLEditorLinkDialog *dialog)
                g_free (text);
        }
 
+       g_object_unref (range);
+       g_object_unref (dom_selection);
        gtk_widget_hide (GTK_WIDGET (dialog));
 }
 
@@ -222,7 +226,7 @@ html_editor_link_dialog_show (GtkWidget *widget)
        EHTMLEditorView *view;
        EHTMLEditorLinkDialog *dialog;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMWindow *dom_window;
        WebKitDOMDOMSelection *dom_selection;
        WebKitDOMRange *range;
        WebKitDOMElement *link;
@@ -232,8 +236,9 @@ html_editor_link_dialog_show (GtkWidget *widget)
        view = e_html_editor_get_view (editor);
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
-       window = webkit_dom_document_get_default_view (document);
-       dom_selection = webkit_dom_dom_window_get_selection (window);
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
 
        /* Reset to default values */
        gtk_entry_set_text (GTK_ENTRY (dialog->priv->url_edit), "http://";);
@@ -305,7 +310,9 @@ html_editor_link_dialog_show (GtkWidget *widget)
                g_free (text);
        }
 
+       g_object_unref (range);
  chainup:
+       g_object_unref (dom_selection);
        /* Chain up to parent implementation */
        GTK_WIDGET_CLASS (e_html_editor_link_dialog_parent_class)->show (widget);
 }
diff --git a/e-util/e-html-editor-selection.c b/e-util/e-html-editor-selection.c
index 2fa29de..5d6808a 100644
--- a/e-util/e-html-editor-selection.c
+++ b/e-util/e-html-editor-selection.c
@@ -113,7 +113,7 @@ html_editor_selection_get_current_range (EHTMLEditorSelection *selection)
        EHTMLEditorView *view;
        WebKitWebView *web_view;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMWindow *dom_window;
        WebKitDOMDOMSelection *dom_selection;
        WebKitDOMRange *range = NULL;
 
@@ -123,11 +123,11 @@ html_editor_selection_get_current_range (EHTMLEditorSelection *selection)
        web_view = WEBKIT_WEB_VIEW (view);
 
        document = webkit_web_view_get_dom_document (web_view);
-       window = webkit_dom_document_get_default_view (document);
-       if (!window)
+       dom_window = webkit_dom_document_get_default_view (document);
+       if (!dom_window)
                goto exit;
 
-       dom_selection = webkit_dom_dom_window_get_selection (window);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
        if (!WEBKIT_DOM_IS_DOM_SELECTION (dom_selection))
                goto exit;
 
@@ -137,6 +137,8 @@ html_editor_selection_get_current_range (EHTMLEditorSelection *selection)
        range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
 
  exit:
+       g_object_unref (dom_selection);
+       g_object_unref (dom_window);
        g_object_unref (view);
 
        return range;
@@ -161,6 +163,7 @@ get_has_style (EHTMLEditorSelection *selection,
                element = WEBKIT_DOM_ELEMENT (node);
        else
                element = webkit_dom_node_get_parent_element (node);
+       g_object_unref (range);
 
        tag_len = strlen (style_tag);
        result = FALSE;
@@ -223,6 +226,7 @@ get_font_property (EHTMLEditorSelection *selection,
                return NULL;
 
        node = webkit_dom_range_get_common_ancestor_container (range, NULL);
+       g_object_unref (range);
        element = e_html_editor_dom_node_find_parent_element (node, "FONT");
        if (!element)
                return NULL;
@@ -906,17 +910,23 @@ e_html_editor_selection_has_text (EHTMLEditorSelection *selection)
        range = html_editor_selection_get_current_range (selection);
 
        node = webkit_dom_range_get_start_container (range, NULL);
-       if (WEBKIT_DOM_IS_TEXT (node))
+       if (WEBKIT_DOM_IS_TEXT (node)) {
+               g_object_unref (range);
                return TRUE;
+       }
 
        node = webkit_dom_range_get_end_container (range, NULL);
-       if (WEBKIT_DOM_IS_TEXT (node))
+       if (WEBKIT_DOM_IS_TEXT (node)) {
+               g_object_unref (range);
                return TRUE;
+       }
 
        node = WEBKIT_DOM_NODE (webkit_dom_range_clone_contents (range, NULL));
        while (node) {
-               if (WEBKIT_DOM_IS_TEXT (node))
+               if (WEBKIT_DOM_IS_TEXT (node)) {
+                       g_object_unref (range);
                        return TRUE;
+               }
 
                if (webkit_dom_node_has_child_nodes (node)) {
                        node = webkit_dom_node_get_first_child (node);
@@ -933,6 +943,8 @@ e_html_editor_selection_has_text (EHTMLEditorSelection *selection)
        if (node)
                g_object_unref (node);
 
+       g_object_unref (range);
+
        return FALSE;
 }
 
@@ -948,6 +960,7 @@ e_html_editor_selection_has_text (EHTMLEditorSelection *selection)
 gchar *
 e_html_editor_selection_get_caret_word (EHTMLEditorSelection *selection)
 {
+       gchar *word;
        WebKitDOMRange *range;
 
        g_return_val_if_fail (E_IS_HTML_EDITOR_SELECTION (selection), NULL);
@@ -957,8 +970,11 @@ e_html_editor_selection_get_caret_word (EHTMLEditorSelection *selection)
        /* Don't operate on the visible selection */
        range = webkit_dom_range_clone_range (range, NULL);
        webkit_dom_range_expand (range, "word", NULL);
+       word = webkit_dom_range_to_string (range, NULL);
+
+       g_object_unref (range);
 
-       return webkit_dom_range_to_string (range, NULL);
+       return word;
 }
 
 /**
@@ -975,7 +991,7 @@ e_html_editor_selection_replace_caret_word (EHTMLEditorSelection *selection,
        EHTMLEditorView *view;
        WebKitWebView *web_view;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMWindow *dom_window;
        WebKitDOMDOMSelection *dom_selection;
        WebKitDOMRange *range;
 
@@ -989,11 +1005,14 @@ e_html_editor_selection_replace_caret_word (EHTMLEditorSelection *selection,
 
        range = html_editor_selection_get_current_range (selection);
        document = webkit_web_view_get_dom_document (web_view);
-       window = webkit_dom_document_get_default_view (document);
-       dom_selection = webkit_dom_dom_window_get_selection (window);
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
 
        webkit_dom_range_expand (range, "word", NULL);
        webkit_dom_dom_selection_add_range (dom_selection, range);
+       g_object_unref (range);
+       g_object_unref (dom_selection);
+       g_object_unref (dom_window);
 
        e_html_editor_view_exec_command (
                view, E_HTML_EDITOR_VIEW_COMMAND_INSERT_HTML, replacement);
@@ -1013,6 +1032,7 @@ e_html_editor_selection_replace_caret_word (EHTMLEditorSelection *selection,
 gboolean
 e_html_editor_selection_is_collapsed (EHTMLEditorSelection *selection)
 {
+       gboolean collapsed;
        WebKitDOMRange *range;
 
        g_return_val_if_fail (E_IS_HTML_EDITOR_SELECTION (selection), TRUE);
@@ -1021,7 +1041,10 @@ e_html_editor_selection_is_collapsed (EHTMLEditorSelection *selection)
        if (!range)
                return TRUE;
 
-       return webkit_dom_range_get_collapsed (range, NULL);
+       collapsed = webkit_dom_range_get_collapsed (range, NULL);
+       g_object_unref (range);
+
+       return collapsed;
 }
 
 /**
@@ -1047,6 +1070,8 @@ e_html_editor_selection_get_string (EHTMLEditorSelection *selection)
        g_free (selection->priv->text);
        selection->priv->text = webkit_dom_range_get_text (range);
 
+       g_object_unref (range);
+
        return selection->priv->text;
 }
 
@@ -1071,7 +1096,7 @@ e_html_editor_selection_replace (EHTMLEditorSelection *selection,
 
        if (!e_html_editor_view_is_undo_redo_in_progress (view)) {
                WebKitDOMDocument *document;
-               WebKitDOMDOMWindow *window;
+               WebKitDOMDOMWindow *dom_window;
                WebKitDOMDOMSelection *dom_selection;
                WebKitDOMRange *range;
 
@@ -1086,12 +1111,15 @@ e_html_editor_selection_replace (EHTMLEditorSelection *selection,
                        &ev->before.end.y);
 
                document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
-               window = webkit_dom_document_get_default_view (document);
-               dom_selection = webkit_dom_dom_window_get_selection (window);
+               dom_window = webkit_dom_document_get_default_view (document);
+               dom_selection = webkit_dom_dom_window_get_selection (dom_window);
 
                range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
                ev->data.string.from = webkit_dom_range_get_text (range);
                ev->data.string.to = g_strdup (new_string);
+               g_object_unref (dom_selection);
+               g_object_unref (dom_window);
+               g_object_unref (range);
        }
 
        e_html_editor_view_exec_command (
@@ -1140,13 +1168,13 @@ e_html_editor_selection_get_alignment_from_node (WebKitDOMNode *node)
        gchar *value;
        WebKitDOMCSSStyleDeclaration *style;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMWindow *dom_window;
 
        document = webkit_dom_node_get_owner_document (node);
-       window = webkit_dom_document_get_default_view (document);
+       dom_window = webkit_dom_document_get_default_view (document);
 
        style = webkit_dom_dom_window_get_computed_style (
-               window, WEBKIT_DOM_ELEMENT (node), NULL);
+               dom_window, WEBKIT_DOM_ELEMENT (node), NULL);
        value = webkit_dom_css_style_declaration_get_property_value (style, "text-align");
 
        if (!value || !*value ||
@@ -1160,6 +1188,9 @@ e_html_editor_selection_get_alignment_from_node (WebKitDOMNode *node)
                alignment = E_HTML_EDITOR_SELECTION_ALIGNMENT_LEFT;
        }
 
+       g_object_unref (dom_window);
+       g_object_unref (style);
+
        g_free (value);
 
        return alignment;
@@ -1181,7 +1212,7 @@ e_html_editor_selection_get_alignment (EHTMLEditorSelection *selection)
        gchar *value;
        WebKitDOMCSSStyleDeclaration *style;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMWindow *dom_window;
        WebKitDOMElement *element;
        WebKitDOMNode *node;
        WebKitDOMRange *range;
@@ -1195,12 +1226,12 @@ e_html_editor_selection_get_alignment (EHTMLEditorSelection *selection)
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
        g_object_unref (view);
-       window = webkit_dom_document_get_default_view (document);
        range = html_editor_selection_get_current_range (selection);
        if (!range)
                return E_HTML_EDITOR_SELECTION_ALIGNMENT_LEFT;
 
        node = webkit_dom_range_get_start_container (range, NULL);
+       g_object_unref (range);
        if (!node)
                return E_HTML_EDITOR_SELECTION_ALIGNMENT_LEFT;
 
@@ -1209,7 +1240,8 @@ e_html_editor_selection_get_alignment (EHTMLEditorSelection *selection)
        else
                element = webkit_dom_node_get_parent_element (node);
 
-       style = webkit_dom_dom_window_get_computed_style (window, element, NULL);
+       dom_window = webkit_dom_document_get_default_view (document);
+       style = webkit_dom_dom_window_get_computed_style (dom_window, element, NULL);
        value = webkit_dom_css_style_declaration_get_property_value (style, "text-align");
 
        if (!value || !*value ||
@@ -1223,6 +1255,8 @@ e_html_editor_selection_get_alignment (EHTMLEditorSelection *selection)
                alignment = E_HTML_EDITOR_SELECTION_ALIGNMENT_LEFT;
        }
 
+       g_object_unref (style);
+       g_object_unref (dom_window);
        g_free (value);
 
        return alignment;
@@ -1685,6 +1719,9 @@ e_html_editor_selection_get_background_color (EHTMLEditorSelection *selection)
                webkit_dom_css_style_declaration_get_property_value (
                        css, "background-color");
 
+       g_object_unref (css);
+       g_object_unref (range);
+
        return selection->priv->background_color;
 }
 
@@ -1861,6 +1898,8 @@ e_html_editor_selection_get_block_format (EHTMLEditorSelection *selection)
                result = E_HTML_EDITOR_SELECTION_BLOCK_FORMAT_PARAGRAPH;
        }
 
+       g_object_unref (range);
+
        return result;
 }
 
@@ -2342,14 +2381,14 @@ format_change_block_to_list (EHTMLEditorSelection *selection,
        if (webkit_dom_element_query_selector (
                WEBKIT_DOM_ELEMENT (block), "span.-x-evo-quoted", NULL)) {
                WebKitDOMElement *element;
-               WebKitDOMDOMWindow *window;
+               WebKitDOMDOMWindow *dom_window;
                WebKitDOMDOMSelection *dom_selection;
                WebKitDOMRange *range;
 
                in_quote = TRUE;
 
-               window = webkit_dom_document_get_default_view (document);
-               dom_selection = webkit_dom_dom_window_get_selection (window);
+               dom_window = webkit_dom_document_get_default_view (document);
+               dom_selection = webkit_dom_dom_window_get_selection (dom_window);
                range = webkit_dom_document_create_range (document);
 
                webkit_dom_range_select_node (range, block, NULL);
@@ -2357,6 +2396,10 @@ format_change_block_to_list (EHTMLEditorSelection *selection,
                webkit_dom_dom_selection_remove_all_ranges (dom_selection);
                webkit_dom_dom_selection_add_range (dom_selection, range);
 
+               g_object_unref (range);
+               g_object_unref (dom_selection);
+               g_object_unref (dom_window);
+
                e_html_editor_view_exec_command (
                        view, E_HTML_EDITOR_VIEW_COMMAND_INSERT_NEW_LINE_IN_QUOTED_CONTENT, NULL);
 
@@ -2739,6 +2782,8 @@ e_html_editor_selection_set_block_format (EHTMLEditorSelection *selection,
                }
        }
 
+       g_object_unref (range);
+
        if (from_list && to_list)
                format_change_list_to_list (selection, format, document, html_mode);
 
@@ -2912,12 +2957,15 @@ e_html_editor_selection_get_font_name (EHTMLEditorSelection *selection)
 
        range = html_editor_selection_get_current_range (selection);
        node = webkit_dom_range_get_common_ancestor_container (range, NULL);
+       g_object_unref (range);
 
        g_free (selection->priv->font_family);
        css = webkit_dom_element_get_style (WEBKIT_DOM_ELEMENT (node));
        selection->priv->font_family =
                webkit_dom_css_style_declaration_get_property_value (css, "fontFamily");
 
+       g_object_unref (css);
+
        return selection->priv->font_family;
 }
 
@@ -3169,6 +3217,7 @@ e_html_editor_selection_is_citation (EHTMLEditorSelection *selection)
                return FALSE;
 
        node = webkit_dom_range_get_common_ancestor_container (range, NULL);
+       g_object_unref (range);
 
        if (WEBKIT_DOM_IS_TEXT (node))
                return get_has_style (selection, "citation");
@@ -3248,8 +3297,9 @@ e_html_editor_selection_is_indented (EHTMLEditorSelection *selection)
        if (!range)
                return FALSE;
 
-       if (e_html_editor_selection_is_collapsed (selection)) {
+       if (webkit_dom_range_get_collapsed (range, NULL)) {
                element = get_element_for_inspection (range);
+               g_object_unref (range);
                return element_has_class (element, "-x-evo-indented");
        } else {
                WebKitDOMNode *node;
@@ -3258,24 +3308,28 @@ e_html_editor_selection_is_indented (EHTMLEditorSelection *selection)
                node = webkit_dom_range_get_end_container (range, NULL);
                /* No selection or whole body selected */
                if (WEBKIT_DOM_IS_HTML_BODY_ELEMENT (node))
-                       return FALSE;
+                       goto out;
 
                element = WEBKIT_DOM_ELEMENT (get_parent_indented_block (node));
                ret_val = element_has_class (element, "-x-evo-indented");
                if (!ret_val)
-                       return FALSE;
+                       goto out;
 
                node = webkit_dom_range_get_start_container (range, NULL);
                /* No selection or whole body selected */
                if (WEBKIT_DOM_IS_HTML_BODY_ELEMENT (node))
-                       return FALSE;
+                       goto out;
 
                element = WEBKIT_DOM_ELEMENT (get_parent_indented_block (node));
                ret_val = element_has_class (element, "-x-evo-indented");
 
+               g_object_unref (range);
                return ret_val;
        }
 
+ out:
+       g_object_unref (range);
+
        return FALSE;
 }
 
@@ -3907,7 +3961,7 @@ e_html_editor_selection_is_bold (EHTMLEditorSelection *selection)
        EHTMLEditorView *view;
        WebKitDOMCSSStyleDeclaration *style;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMWindow *dom_window;
        WebKitDOMNode *node;
        WebKitDOMElement *element;
        WebKitDOMRange *range;
@@ -3924,13 +3978,13 @@ e_html_editor_selection_is_bold (EHTMLEditorSelection *selection)
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
        g_object_unref (view);
-       window = webkit_dom_document_get_default_view (document);
 
        range = html_editor_selection_get_current_range (selection);
        if (!range)
                return FALSE;
 
        node = webkit_dom_range_get_common_ancestor_container (range, NULL);
+       g_object_unref (range);
        /* If we are changing the format of block we have to re-set bold property,
         * otherwise it will be turned off because of no text in composer */
        text_content = webkit_dom_node_get_text_content (node);
@@ -3945,7 +3999,8 @@ e_html_editor_selection_is_bold (EHTMLEditorSelection *selection)
        else
                element = webkit_dom_node_get_parent_element (node);
 
-       style = webkit_dom_dom_window_get_computed_style (window, element, NULL);
+       dom_window = webkit_dom_document_get_default_view (document);
+       style = webkit_dom_dom_window_get_computed_style (dom_window, element, NULL);
        value = webkit_dom_css_style_declaration_get_property_value (style, "font-weight");
 
        if (g_strstr_len (value, -1, "normal"))
@@ -3953,6 +4008,9 @@ e_html_editor_selection_is_bold (EHTMLEditorSelection *selection)
        else
                ret_val = TRUE;
 
+       g_object_unref (style);
+       g_object_unref (dom_window);
+
        g_free (value);
        return ret_val;
 }
@@ -4071,7 +4129,7 @@ e_html_editor_selection_is_italic (EHTMLEditorSelection *selection)
        EHTMLEditorView *view;
        WebKitDOMCSSStyleDeclaration *style;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMWindow *dom_window;
        WebKitDOMNode *node;
        WebKitDOMElement *element;
        WebKitDOMRange *range;
@@ -4088,13 +4146,13 @@ e_html_editor_selection_is_italic (EHTMLEditorSelection *selection)
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
        g_object_unref (view);
-       window = webkit_dom_document_get_default_view (document);
 
        range = html_editor_selection_get_current_range (selection);
        if (!range)
                return FALSE;
 
        node = webkit_dom_range_get_common_ancestor_container (range, NULL);
+       g_object_unref (range);
        /* If we are changing the format of block we have to re-set italic property,
         * otherwise it will be turned off because of no text in composer */
        text_content = webkit_dom_node_get_text_content (node);
@@ -4109,7 +4167,8 @@ e_html_editor_selection_is_italic (EHTMLEditorSelection *selection)
        else
                element = webkit_dom_node_get_parent_element (node);
 
-       style = webkit_dom_dom_window_get_computed_style (window, element, NULL);
+       dom_window = webkit_dom_document_get_default_view (document);
+       style = webkit_dom_dom_window_get_computed_style (dom_window, element, NULL);
        value = webkit_dom_css_style_declaration_get_property_value (style, "font-style");
 
        if (g_strstr_len (value, -1, "italic"))
@@ -4117,6 +4176,9 @@ e_html_editor_selection_is_italic (EHTMLEditorSelection *selection)
        else
                ret_val = FALSE;
 
+       g_object_unref (style);
+       g_object_unref (dom_window);
+
        g_free (value);
        return ret_val;
 }
@@ -4185,7 +4247,7 @@ e_html_editor_selection_is_monospaced (EHTMLEditorSelection *selection)
        EHTMLEditorView *view;
        WebKitDOMCSSStyleDeclaration *style;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMWindow *dom_window;
        WebKitDOMNode *node;
        WebKitDOMElement *element;
        WebKitDOMRange *range;
@@ -4202,13 +4264,13 @@ e_html_editor_selection_is_monospaced (EHTMLEditorSelection *selection)
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
        g_object_unref (view);
-       window = webkit_dom_document_get_default_view (document);
 
        range = html_editor_selection_get_current_range (selection);
        if (!range)
                return FALSE;
 
        node = webkit_dom_range_get_common_ancestor_container (range, NULL);
+       g_object_unref (range);
        /* If we are changing the format of block we have to re-set italic property,
         * otherwise it will be turned off because of no text in composer */
        text_content = webkit_dom_node_get_text_content (node);
@@ -4223,7 +4285,8 @@ e_html_editor_selection_is_monospaced (EHTMLEditorSelection *selection)
        else
                element = webkit_dom_node_get_parent_element (node);
 
-       style = webkit_dom_dom_window_get_computed_style (window, element, NULL);
+       dom_window = webkit_dom_document_get_default_view (document);
+       style = webkit_dom_dom_window_get_computed_style (dom_window, element, NULL);
        value = webkit_dom_css_style_declaration_get_property_value (style, "font-family");
 
        if (g_strstr_len (value, -1, "monospace"))
@@ -4231,6 +4294,9 @@ e_html_editor_selection_is_monospaced (EHTMLEditorSelection *selection)
        else
                ret_val = FALSE;
 
+       g_object_unref (style);
+       g_object_unref (dom_window);
+
        g_free (value);
        return ret_val;
 }
@@ -4251,8 +4317,8 @@ e_html_editor_selection_set_monospaced (EHTMLEditorSelection *selection,
        EHTMLEditorViewHistoryEvent *ev = NULL;
        WebKitDOMDocument *document;
        WebKitDOMRange *range;
-       WebKitDOMDOMWindow *window;
-       WebKitDOMDOMSelection *window_selection;
+       WebKitDOMDOMWindow *dom_window;
+       WebKitDOMDOMSelection *dom_selection;
 
        g_return_if_fail (E_IS_HTML_EDITOR_SELECTION (selection));
 
@@ -4283,8 +4349,8 @@ e_html_editor_selection_set_monospaced (EHTMLEditorSelection *selection,
        }
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
-       window = webkit_dom_document_get_default_view (document);
-       window_selection = webkit_dom_dom_window_get_selection (window);
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
 
        if (monospaced) {
                guint font_size;
@@ -4305,7 +4371,7 @@ e_html_editor_selection_set_monospaced (EHTMLEditorSelection *selection,
                        g_free (font_size_str);
                }
 
-               if (!e_html_editor_selection_is_collapsed (selection)) {
+               if (!webkit_dom_range_get_collapsed (range, NULL)) {
                        webkit_dom_range_surround_contents (
                                range, WEBKIT_DOM_NODE (monospace), NULL);
 
@@ -4348,6 +4414,9 @@ e_html_editor_selection_set_monospaced (EHTMLEditorSelection *selection,
 
                        if (!is_monospaced_element (tt_element)) {
                                g_object_unref (view);
+                               g_object_unref (range);
+                               g_object_unref (dom_selection);
+                               g_object_unref (dom_window);
                                return;
                        }
                }
@@ -4453,13 +4522,11 @@ e_html_editor_selection_set_monospaced (EHTMLEditorSelection *selection,
                        webkit_dom_range_set_end_after (
                                new_range, WEBKIT_DOM_NODE (tt_element), NULL);
 
-                       webkit_dom_dom_selection_remove_all_ranges (
-                               window_selection);
-                       webkit_dom_dom_selection_add_range (
-                               window_selection, new_range);
-
+                       webkit_dom_dom_selection_remove_all_ranges (dom_selection);
+                       webkit_dom_dom_selection_add_range (dom_selection, new_range);
                        webkit_dom_dom_selection_modify (
-                               window_selection, "move", "right", "character");
+                               dom_selection, "move", "right", "character");
+                       g_object_unref (new_range);
                }
 
                /* Re-set formatting */
@@ -4488,6 +4555,9 @@ e_html_editor_selection_set_monospaced (EHTMLEditorSelection *selection,
 
        e_html_editor_view_force_spell_check_for_current_paragraph (view);
 
+       g_object_unref (range);
+       g_object_unref (dom_selection);
+       g_object_unref (dom_window);
        g_object_unref (view);
 
        g_object_notify (G_OBJECT (selection), "monospaced");
@@ -4510,7 +4580,7 @@ e_html_editor_selection_is_strikethrough (EHTMLEditorSelection *selection)
        EHTMLEditorView *view;
        WebKitDOMCSSStyleDeclaration *style;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMWindow *dom_window;
        WebKitDOMNode *node;
        WebKitDOMElement *element;
        WebKitDOMRange *range;
@@ -4527,13 +4597,13 @@ e_html_editor_selection_is_strikethrough (EHTMLEditorSelection *selection)
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
        g_object_unref (view);
-       window = webkit_dom_document_get_default_view (document);
 
        range = html_editor_selection_get_current_range (selection);
        if (!range)
                return FALSE;
 
        node = webkit_dom_range_get_common_ancestor_container (range, NULL);
+       g_object_unref (range);
        /* If we are changing the format of block we have to re-set strikethrough property,
         * otherwise it will be turned off because of no text in composer */
        text_content = webkit_dom_node_get_text_content (node);
@@ -4548,7 +4618,8 @@ e_html_editor_selection_is_strikethrough (EHTMLEditorSelection *selection)
        else
                element = webkit_dom_node_get_parent_element (node);
 
-       style = webkit_dom_dom_window_get_computed_style (window, element, NULL);
+       dom_window = webkit_dom_document_get_default_view (document);
+       style = webkit_dom_dom_window_get_computed_style (dom_window, element, NULL);
        value = webkit_dom_css_style_declaration_get_property_value (style, "text-decoration");
 
        if (g_strstr_len (value, -1, "line-through"))
@@ -4556,6 +4627,9 @@ e_html_editor_selection_is_strikethrough (EHTMLEditorSelection *selection)
        else
                ret_val = get_has_style (selection, "strike");
 
+       g_object_unref (style);
+       g_object_unref (dom_window);
+
        g_free (value);
        return ret_val;
 }
@@ -4615,6 +4689,7 @@ e_html_editor_selection_is_subscript (EHTMLEditorSelection *selection)
 
        range = html_editor_selection_get_current_range (selection);
        node = webkit_dom_range_get_common_ancestor_container (range, NULL);
+       g_object_unref (range);
 
        while (node) {
                if (element_has_tag (WEBKIT_DOM_ELEMENT (node), "sub"))
@@ -4686,6 +4761,7 @@ e_html_editor_selection_is_superscript (EHTMLEditorSelection *selection)
 
        range = html_editor_selection_get_current_range (selection);
        node = webkit_dom_range_get_common_ancestor_container (range, NULL);
+       g_object_unref (range);
 
        while (node) {
                if (element_has_tag (WEBKIT_DOM_ELEMENT (node), "sup"))
@@ -4744,7 +4820,7 @@ e_html_editor_selection_is_underline (EHTMLEditorSelection *selection)
        EHTMLEditorView *view;
        WebKitDOMCSSStyleDeclaration *style;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMWindow *dom_window;
        WebKitDOMNode *node;
        WebKitDOMElement *element;
        WebKitDOMRange *range;
@@ -4761,13 +4837,13 @@ e_html_editor_selection_is_underline (EHTMLEditorSelection *selection)
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
        g_object_unref (view);
-       window = webkit_dom_document_get_default_view (document);
 
        range = html_editor_selection_get_current_range (selection);
        if (!range)
                return FALSE;
 
        node = webkit_dom_range_get_common_ancestor_container (range, NULL);
+       g_object_unref (range);
        /* If we are changing the format of block we have to re-set underline property,
         * otherwise it will be turned off because of no text in composer */
        text_content = webkit_dom_node_get_text_content (node);
@@ -4785,7 +4861,8 @@ e_html_editor_selection_is_underline (EHTMLEditorSelection *selection)
        if (WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (element))
                return FALSE;
 
-       style = webkit_dom_dom_window_get_computed_style (window, element, NULL);
+       dom_window = webkit_dom_document_get_default_view (document);
+       style = webkit_dom_dom_window_get_computed_style (dom_window, element, NULL);
        value = webkit_dom_css_style_declaration_get_property_value (style, "text-decoration");
 
        if (g_strstr_len (value, -1, "underline"))
@@ -4793,6 +4870,9 @@ e_html_editor_selection_is_underline (EHTMLEditorSelection *selection)
        else
                ret_val = get_has_style (selection, "u");
 
+       g_object_unref (style);
+       g_object_unref (dom_window);
+
        g_free (value);
        return ret_val;
 }
@@ -4835,7 +4915,7 @@ e_html_editor_selection_unlink (EHTMLEditorSelection *selection)
        EHTMLEditorView *view;
        gchar *text;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMWindow *dom_window;
        WebKitDOMDOMSelection *dom_selection;
        WebKitDOMRange *range;
        WebKitDOMElement *link;
@@ -4847,13 +4927,16 @@ e_html_editor_selection_unlink (EHTMLEditorSelection *selection)
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
        g_object_unref (view);
-       window = webkit_dom_document_get_default_view (document);
-       dom_selection = webkit_dom_dom_window_get_selection (window);
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
 
        range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
        link = e_html_editor_dom_node_find_parent_element (
                        webkit_dom_range_get_start_container (range, NULL), "A");
 
+       g_object_unref (dom_selection);
+       g_object_unref (dom_window);
+
        if (!link) {
                WebKitDOMNode *node;
 
@@ -4861,12 +4944,16 @@ e_html_editor_selection_unlink (EHTMLEditorSelection *selection)
                node = webkit_dom_range_get_common_ancestor_container (range, NULL);
                if (node && !WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (node)) {
                        link = e_html_editor_dom_node_find_parent_element (node, "A");
-                       if (link && !WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (link))
+                       if (link && !WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (link)) {
+                               g_object_unref (range);
                                return;
+                       }
                } else
                        link = WEBKIT_DOM_ELEMENT (node);
        }
 
+       g_object_unref (range);
+
        if (!link)
                return;
 
@@ -5526,22 +5613,25 @@ e_html_editor_selection_move_caret_into_element (WebKitDOMDocument *document,
                                                  WebKitDOMElement *element,
                                                  gboolean to_start)
 {
-       WebKitDOMDOMWindow *window;
-       WebKitDOMDOMSelection *window_selection;
+       WebKitDOMDOMWindow *dom_window;
+       WebKitDOMDOMSelection *dom_selection;
        WebKitDOMRange *new_range;
 
        if (!element)
                return;
 
-       window = webkit_dom_document_get_default_view (document);
-       window_selection = webkit_dom_dom_window_get_selection (window);
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
        new_range = webkit_dom_document_create_range (document);
 
        webkit_dom_range_select_node_contents (
                new_range, WEBKIT_DOM_NODE (element), NULL);
        webkit_dom_range_collapse (new_range, to_start, NULL);
-       webkit_dom_dom_selection_remove_all_ranges (window_selection);
-       webkit_dom_dom_selection_add_range (window_selection, new_range);
+       webkit_dom_dom_selection_remove_all_ranges (dom_selection);
+       webkit_dom_dom_selection_add_range (dom_selection, new_range);
+       g_object_unref (new_range);
+       g_object_unref (dom_selection);
+       g_object_unref (dom_window);
 }
 
 static gint
@@ -5649,12 +5739,14 @@ wrap_lines (EHTMLEditorSelection *selection,
 
        if (selection) {
                WebKitDOMNodeList *wrap_br;
+               WebKitDOMRange *range;
 
                paragraph_char_count = g_utf8_strlen (
                        e_html_editor_selection_get_string (selection), -1);
 
-               fragment = webkit_dom_range_clone_contents (
-                       html_editor_selection_get_current_range (selection), NULL);
+               range = html_editor_selection_get_current_range (selection);
+               fragment = webkit_dom_range_clone_contents (range, NULL);
+               g_object_unref (range);
 
                /* Select all BR elements or just ours that are used for wrapping.
                 * We are not removing user BR elements when this function is activated
@@ -6145,6 +6237,7 @@ e_html_editor_selection_put_node_into_paragraph (EHTMLEditorSelection *selection
        if (with_input)
                add_selection_markers_into_element_end (document, container, NULL, NULL);
 
+       g_object_unref (range);
        return container;
 }
 
@@ -6439,12 +6532,18 @@ e_html_editor_selection_save (EHTMLEditorSelection *selection)
        /* First remove all markers (if present) */
        remove_selection_markers (document);
 
-       if (webkit_dom_dom_selection_get_range_count (dom_selection) < 1)
+       if (webkit_dom_dom_selection_get_range_count (dom_selection) < 1) {
+               g_object_unref (dom_selection);
+               g_object_unref (dom_window);
                return;
+       }
 
        range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
-       if (!range)
+       if (!range) {
+               g_object_unref (dom_selection);
+               g_object_unref (dom_window);
                return;
+       }
 
        anchor = webkit_dom_dom_selection_get_anchor_node (dom_selection);
        anchor_offset = webkit_dom_dom_selection_get_anchor_offset (dom_selection);
@@ -6673,6 +6772,9 @@ e_html_editor_selection_save (EHTMLEditorSelection *selection)
        /* Don't save selection straight into body */
        if (WEBKIT_DOM_IS_HTML_BODY_ELEMENT (split_node)) {
                remove_node (WEBKIT_DOM_NODE (start_marker));
+               g_object_unref (range);
+               g_object_unref (dom_selection);
+               g_object_unref (dom_window);
                return;
        }
 
@@ -6726,18 +6828,16 @@ e_html_editor_selection_save (EHTMLEditorSelection *selection)
        }
  out:
        if (!collapsed) {
-               WebKitDOMDOMSelection *dom_selection;
-               WebKitDOMDOMWindow *window;
-
                webkit_dom_range_set_start_after (range, WEBKIT_DOM_NODE (start_marker), NULL);
                webkit_dom_range_set_end_before (range, WEBKIT_DOM_NODE (end_marker), NULL);
 
-               window = webkit_dom_document_get_default_view (document);
-               dom_selection = webkit_dom_dom_window_get_selection (window);
-
                webkit_dom_dom_selection_remove_all_ranges (dom_selection);
                webkit_dom_dom_selection_add_range (dom_selection, range);
        }
+
+       g_object_unref (range);
+       g_object_unref (dom_selection);
+       g_object_unref (dom_window);
 }
 
 /**
@@ -6763,7 +6863,7 @@ e_html_editor_selection_restore (EHTMLEditorSelection *selection)
        WebKitDOMNode *parent_start, *parent_end, *anchor;
        WebKitDOMRange *range;
        WebKitDOMDOMSelection *dom_selection;
-       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMWindow *dom_window;
 
        g_return_if_fail (E_IS_HTML_EDITOR_SELECTION (selection));
 
@@ -6774,10 +6874,12 @@ e_html_editor_selection_restore (EHTMLEditorSelection *selection)
 
        document = webkit_web_view_get_dom_document (web_view);
        g_object_unref (view);
-       window = webkit_dom_document_get_default_view (document);
-       dom_selection = webkit_dom_dom_window_get_selection (window);
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
        range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
+       g_object_unref (dom_window);
        if (!range) {
+               g_object_unref (dom_selection);
                remove_selection_markers (document);
                return;
        }
@@ -6804,15 +6906,20 @@ e_html_editor_selection_restore (EHTMLEditorSelection *selection)
                                        remove_node (selection_end_marker);
 
                                        webkit_dom_node_normalize (parent_start);
+                                       g_object_unref (range);
+                                       g_object_unref (dom_selection);
                                        return;
                                }
                        }
                }
        }
 
+       g_object_unref (range);
        range = webkit_dom_document_create_range (document);
-       if (!range)
+       if (!range) {
+               g_object_unref (dom_selection);
                return;
+       }
 
        marker = webkit_dom_document_get_element_by_id (
                document, "-x-evo-selection-start-marker");
@@ -6821,6 +6928,8 @@ e_html_editor_selection_restore (EHTMLEditorSelection *selection)
                        document, "-x-evo-selection-end-marker");
                if (marker)
                        remove_node (WEBKIT_DOM_NODE (marker));
+               g_object_unref (dom_selection);
+               g_object_unref (range);
                return;
        }
 
@@ -6837,6 +6946,8 @@ e_html_editor_selection_restore (EHTMLEditorSelection *selection)
                        document, "-x-evo-selection-start-marker");
                if (marker)
                        remove_node (WEBKIT_DOM_NODE (marker));
+               g_object_unref (dom_selection);
+               g_object_unref (range);
                return;
        }
 
@@ -6865,6 +6976,8 @@ e_html_editor_selection_restore (EHTMLEditorSelection *selection)
        }
        webkit_dom_dom_selection_add_range (dom_selection, range);
        webkit_dom_dom_selection_extend (dom_selection, anchor, offset, NULL);
+       g_object_unref (range);
+       g_object_unref (dom_selection);
 }
 
 void
@@ -6892,6 +7005,9 @@ e_html_editor_selection_set_on_point (EHTMLEditorSelection *selection,
        range = webkit_dom_document_caret_range_from_point (document, x, y);
        webkit_dom_dom_selection_remove_all_ranges (dom_selection);
        webkit_dom_dom_selection_add_range (dom_selection, range);
+       g_object_unref (range);
+       g_object_unref (dom_selection);
+       g_object_unref (dom_window);
 }
 
 static void
@@ -6903,7 +7019,7 @@ html_editor_selection_modify (EHTMLEditorSelection *selection,
        EHTMLEditorView *view;
        WebKitWebView *web_view;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMWindow *dom_window;
        WebKitDOMDOMSelection *dom_selection;
        const gchar *granularity_str;
 
@@ -6915,8 +7031,8 @@ html_editor_selection_modify (EHTMLEditorSelection *selection,
        web_view = WEBKIT_WEB_VIEW (view);
 
        document = webkit_web_view_get_dom_document (web_view);
-       window = webkit_dom_document_get_default_view (document);
-       dom_selection = webkit_dom_dom_window_get_selection (window);
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
 
        switch (granularity) {
                case E_HTML_EDITOR_SELECTION_GRANULARITY_CHARACTER:
@@ -6932,6 +7048,8 @@ html_editor_selection_modify (EHTMLEditorSelection *selection,
                forward ? "forward" : "backward",
                granularity_str);
 
+       g_object_unref (dom_selection);
+       g_object_unref (dom_window);
        g_object_unref (view);
 }
 
@@ -6974,7 +7092,7 @@ e_html_editor_selection_scroll_to_caret (EHTMLEditorSelection *selection)
        glong window_top, window_left, window_right, window_bottom;
        EHTMLEditorView *view;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMWindow *dom_window;
        WebKitDOMElement *selection_start_marker;
 
        e_html_editor_selection_save (selection);
@@ -6988,12 +7106,12 @@ e_html_editor_selection_scroll_to_caret (EHTMLEditorSelection *selection)
        if (!selection_start_marker)
                return;
 
-       window = webkit_dom_document_get_default_view (document);
+       dom_window = webkit_dom_document_get_default_view (document);
 
-       window_top = webkit_dom_dom_window_get_scroll_y (window);
-       window_left = webkit_dom_dom_window_get_scroll_x (window);
-       window_bottom = window_top + webkit_dom_dom_window_get_inner_height (window);
-       window_right = window_left + webkit_dom_dom_window_get_inner_width (window);
+       window_top = webkit_dom_dom_window_get_scroll_y (dom_window);
+       window_left = webkit_dom_dom_window_get_scroll_x (dom_window);
+       window_bottom = window_top + webkit_dom_dom_window_get_inner_height (dom_window);
+       window_right = window_left + webkit_dom_dom_window_get_inner_width (dom_window);
 
        element_left = webkit_dom_element_get_offset_left (selection_start_marker);
        element_top = webkit_dom_element_get_offset_top (selection_start_marker);
@@ -7005,4 +7123,6 @@ e_html_editor_selection_scroll_to_caret (EHTMLEditorSelection *selection)
        }
 
        e_html_editor_selection_restore (selection);
+
+       g_object_unref (dom_window);
 }
diff --git a/e-util/e-html-editor-spell-check-dialog.c b/e-util/e-html-editor-spell-check-dialog.c
index 3deac1c..a51f344 100644
--- a/e-util/e-html-editor-spell-check-dialog.c
+++ b/e-util/e-html-editor-spell-check-dialog.c
@@ -180,6 +180,7 @@ html_editor_spell_check_dialog_next (EHTMLEditorSpellCheckDialog *dialog)
                range = webkit_dom_dom_selection_get_range_at (
                        dialog->priv->selection, 0, NULL);
                word = webkit_dom_range_get_text (range);
+               g_object_unref (range);
 
                checker = WEBKIT_SPELL_CHECKER (webkit_get_text_checker ());
                webkit_spell_checker_check_spelling_of_string (
@@ -277,6 +278,7 @@ html_editor_spell_check_dialog_prev (EHTMLEditorSpellCheckDialog *dialog)
                range = webkit_dom_dom_selection_get_range_at (
                        dialog->priv->selection, 0, NULL);
                word = webkit_dom_range_get_text (range);
+               g_object_unref (range);
 
                checker = WEBKIT_SPELL_CHECKER (webkit_get_text_checker ());
                webkit_spell_checker_check_spelling_of_string (
@@ -419,7 +421,7 @@ html_editor_spell_check_dialog_show (GtkWidget *widget)
        EHTMLEditorView *view;
        EHTMLEditorSpellCheckDialog *dialog;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMWindow *dom_window;
 
        dialog = E_HTML_EDITOR_SPELL_CHECK_DIALOG (widget);
 
@@ -430,8 +432,9 @@ html_editor_spell_check_dialog_show (GtkWidget *widget)
        view = e_html_editor_get_view (editor);
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
-       window = webkit_dom_document_get_default_view (document);
-       dialog->priv->selection = webkit_dom_dom_window_get_selection (window);
+       dom_window = webkit_dom_document_get_default_view (document);
+       dialog->priv->selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
 
        /* Select the first word or quit */
        if (html_editor_spell_check_dialog_next (dialog)) {
@@ -447,6 +450,7 @@ html_editor_spell_check_dialog_finalize (GObject *object)
 
        priv = E_HTML_EDITOR_SPELL_CHECK_DIALOG_GET_PRIVATE (object);
 
+       g_clear_object (&priv->selection);
        g_free (priv->word);
 
        /* Chain up to parent's finalize() method. */
diff --git a/e-util/e-html-editor-table-dialog.c b/e-util/e-html-editor-table-dialog.c
index 56a61f8..1a9e83a 100644
--- a/e-util/e-html-editor-table-dialog.c
+++ b/e-util/e-html-editor-table-dialog.c
@@ -632,23 +632,25 @@ html_editor_table_dialog_show (GtkWidget *widget)
        EHTMLEditor *editor;
        EHTMLEditorView *view;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
-       WebKitDOMDOMSelection *selection;
+       WebKitDOMDOMWindow *dom_window;
+       WebKitDOMDOMSelection *dom_selection;
 
        dialog = E_HTML_EDITOR_TABLE_DIALOG (widget);
        editor = e_html_editor_dialog_get_editor (E_HTML_EDITOR_DIALOG (dialog));
        view = e_html_editor_get_view (editor);
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
-       window = webkit_dom_document_get_default_view (document);
-       selection = webkit_dom_dom_window_get_selection (window);
-       if (selection && (webkit_dom_dom_selection_get_range_count (selection) > 0)) {
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
+       if (dom_selection && (webkit_dom_dom_selection_get_range_count (dom_selection) > 0)) {
                WebKitDOMElement *table;
                WebKitDOMRange *range;
 
-               range = webkit_dom_dom_selection_get_range_at (selection, 0, NULL);
+               range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
                table = e_html_editor_dom_node_find_parent_element (
                        webkit_dom_range_get_start_container (range, NULL), "TABLE");
+               g_object_unref (range);
 
                if (!table) {
                        dialog->priv->table_element = WEBKIT_DOM_HTML_TABLE_ELEMENT (
@@ -677,6 +679,8 @@ html_editor_table_dialog_show (GtkWidget *widget)
                }
        }
 
+       g_object_unref (dom_selection);
+
        /* Chain up to parent implementation */
        GTK_WIDGET_CLASS (e_html_editor_table_dialog_parent_class)->show (widget);
 }
diff --git a/e-util/e-html-editor-view.c b/e-util/e-html-editor-view.c
index ffc222b..8a12be5 100644
--- a/e-util/e-html-editor-view.c
+++ b/e-util/e-html-editor-view.c
@@ -187,18 +187,23 @@ static WebKitDOMRange *
 html_editor_view_get_dom_range (EHTMLEditorView *view)
 {
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
-       WebKitDOMDOMSelection *selection;
+       WebKitDOMDOMWindow *dom_window;
+       WebKitDOMDOMSelection *dom_selection;
+       WebKitDOMRange *range;
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
-       window = webkit_dom_document_get_default_view (document);
-       selection = webkit_dom_dom_window_get_selection (window);
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
 
-       if (webkit_dom_dom_selection_get_range_count (selection) < 1) {
+       if (webkit_dom_dom_selection_get_range_count (dom_selection) < 1) {
+               g_object_unref (dom_selection);
                return NULL;
        }
 
-       return webkit_dom_dom_selection_get_range_at (selection, 0, NULL);
+       range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
+       g_object_unref (dom_selection);
+       return range;
 }
 
 #if d(1)+0
@@ -478,11 +483,13 @@ perform_spell_check (WebKitDOMDOMSelection *dom_selection,
         * http://www.w3.org/html/wg/drafts/html/master/editing.html#dom-forcespellcheck */
        /* We are moving forward word by word until we hit the text on the end. */
        while (actual && webkit_dom_range_compare_boundary_points (end_range, 2, actual, NULL) != 0) {
+               g_object_unref (actual);
                webkit_dom_dom_selection_modify (
                        dom_selection, "move", "forward", "word");
                actual = webkit_dom_dom_selection_get_range_at (
                        dom_selection, 0, NULL);
        }
+       g_object_unref (actual);
 }
 
 void
@@ -501,8 +508,6 @@ e_html_editor_view_force_spell_check_for_current_paragraph (EHTMLEditorView *vie
                return;
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
-       dom_window = webkit_dom_document_get_default_view (document);
-       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
 
        element = webkit_dom_document_query_selector (
                document, "body[spellcheck=true]", NULL);
@@ -546,6 +551,9 @@ e_html_editor_view_force_spell_check_for_current_paragraph (EHTMLEditorView *vie
                end_range, WEBKIT_DOM_NODE (text), NULL);
        webkit_dom_range_collapse (end_range, FALSE, NULL);
 
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+
        /* Move on the beginning of the paragraph */
        actual = webkit_dom_document_create_range (document);
        webkit_dom_range_select_node_contents (
@@ -557,6 +565,10 @@ e_html_editor_view_force_spell_check_for_current_paragraph (EHTMLEditorView *vie
        actual = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
        perform_spell_check (dom_selection, actual, end_range);
 
+       g_object_unref (dom_selection);
+       g_object_unref (dom_window);
+       g_object_unref (end_range);
+
        /* Remove the text that we inserted on the end of the paragraph */
        remove_node (WEBKIT_DOM_NODE (text));
 
@@ -661,8 +673,6 @@ refresh_spell_check (EHTMLEditorView *view,
        WebKitDOMText *text;
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
-       dom_window = webkit_dom_document_get_default_view (document);
-       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
        body = webkit_dom_document_get_body (document);
 
        if (!webkit_dom_node_get_first_child (WEBKIT_DOM_NODE (body)))
@@ -715,6 +725,9 @@ refresh_spell_check (EHTMLEditorView *view,
                end_range, WEBKIT_DOM_NODE (text), NULL);
        webkit_dom_range_collapse (end_range, FALSE, NULL);
 
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+
        /* Move on the beginning of the document */
        webkit_dom_dom_selection_modify (
                dom_selection, "move", "backward", "documentboundary");
@@ -722,6 +735,10 @@ refresh_spell_check (EHTMLEditorView *view,
        actual = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
        perform_spell_check (dom_selection, actual, end_range);
 
+       g_object_unref (dom_selection);
+       g_object_unref (dom_window);
+       g_object_unref (end_range);
+
        /* Remove the text that we inserted on the end of the body */
        remove_node (WEBKIT_DOM_NODE (text));
 
@@ -754,8 +771,6 @@ e_html_editor_view_force_spell_check_in_viewport (EHTMLEditorView *view)
                return;
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
-       dom_window = webkit_dom_document_get_default_view (document);
-       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
        body = WEBKIT_DOM_HTML_ELEMENT (webkit_dom_document_query_selector (
                document, "body[spellcheck=true]", NULL));
 
@@ -782,6 +797,9 @@ e_html_editor_view_force_spell_check_in_viewport (EHTMLEditorView *view)
        /* Append some text on the end of the body */
        text = webkit_dom_document_create_text_node (document, "-x-evo-end");
 
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+
        /* We have to add 10 px offset as otherwise just the HTML element will be returned */
        viewport_height = webkit_dom_dom_window_get_inner_height (dom_window);
        last_element = webkit_dom_document_element_from_point (document, 10, viewport_height - 10);
@@ -805,6 +823,10 @@ e_html_editor_view_force_spell_check_in_viewport (EHTMLEditorView *view)
        webkit_dom_dom_selection_add_range (dom_selection, actual);
        perform_spell_check (dom_selection, actual, end_range);
 
+       g_object_unref (dom_selection);
+       g_object_unref (dom_window);
+       g_object_unref (end_range);
+
        /* Remove the text that we inserted on the end of the body */
        remove_node (WEBKIT_DOM_NODE (text));
 
@@ -935,10 +957,15 @@ return_pressed_in_empty_line (EHTMLEditorSelection *selection,
 
        dom_window = webkit_dom_document_get_default_view (document);
        dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
 
        range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
-       if (!range)
+       if (!range) {
+               g_object_unref (dom_selection);
                return FALSE;
+       }
+
+       g_object_unref (dom_selection);
 
        node = webkit_dom_range_get_start_container (range, NULL);
        if (!WEBKIT_DOM_IS_TEXT (node)) {
@@ -950,11 +977,18 @@ return_pressed_in_empty_line (EHTMLEditorSelection *selection,
                        WebKitDOMNode *prev_sibling;
 
                        prev_sibling = webkit_dom_node_get_previous_sibling (node);
-                       if (!prev_sibling)
-                               return webkit_dom_range_get_collapsed (range, NULL);
+                       if (!prev_sibling) {
+                               gboolean collapsed;
+
+                               collapsed = webkit_dom_range_get_collapsed (range, NULL);
+                               g_object_unref (range);
+                               return collapsed;
+                       }
                }
        }
 
+       g_object_unref (range);
+
        return FALSE;
 }
 
@@ -1909,6 +1943,7 @@ emoticon_insert_span (EHTMLEditorView *view,
 
        range = html_editor_view_get_dom_range (view);
        node = webkit_dom_range_get_end_container (range, NULL);
+       g_object_unref (range);
        if (WEBKIT_DOM_IS_TEXT (node))
                node_text = webkit_dom_text_get_whole_text (WEBKIT_DOM_TEXT (node));
 
@@ -2423,10 +2458,14 @@ body_keypress_event_cb (WebKitDOMElement *element,
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
        dom_window = webkit_dom_document_get_default_view (document);
        dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
        range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
 
-       if (save_history_before_event_in_table (view, range))
+       if (save_history_before_event_in_table (view, range)) {
+               g_object_unref (range);
+               g_object_unref (dom_selection);
                return;
+       }
 
        if (!webkit_dom_range_get_collapsed (range, NULL)) {
                EHTMLEditorViewHistoryEvent *ev;
@@ -2447,6 +2486,9 @@ body_keypress_event_cb (WebKitDOMElement *element,
 
                e_html_editor_view_insert_new_history_event (view, ev);
        }
+
+       g_object_unref (range);
+       g_object_unref (dom_selection);
 }
 
 static gboolean
@@ -2464,8 +2506,10 @@ save_history_after_event_in_table (EHTMLEditorView *view)
        dom_window = webkit_dom_document_get_default_view (document);
        dom_selection = webkit_dom_dom_window_get_selection (dom_window);
 
-       if (!webkit_dom_dom_selection_get_range_count (dom_selection))
+       if (!webkit_dom_dom_selection_get_range_count (dom_selection)) {
+               g_object_unref (dom_selection);
                return FALSE;
+       }
        range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
 
        /* Find if writing into table. */
@@ -2475,6 +2519,9 @@ save_history_after_event_in_table (EHTMLEditorView *view)
        else
                element = get_parent_block_element (node);
 
+       g_object_unref (dom_selection);
+       g_object_unref (range);
+
        /* If writing to table we have to create different history event. */
        if (WEBKIT_DOM_IS_HTML_TABLE_CELL_ELEMENT (element)) {
                ev = view->priv->history->data;
@@ -2514,9 +2561,12 @@ save_history_for_input (EHTMLEditorView *view)
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
        dom_window = webkit_dom_document_get_default_view (document);
        dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
 
-       if (!webkit_dom_dom_selection_get_range_count (dom_selection))
+       if (!webkit_dom_dom_selection_get_range_count (dom_selection)) {
+               g_object_unref (dom_selection);
                return;
+       }
 
        ev = g_new0 (EHTMLEditorViewHistoryEvent, 1);
        ev->type = HISTORY_INPUT;
@@ -2549,6 +2599,7 @@ save_history_for_input (EHTMLEditorView *view)
                element_start = webkit_dom_document_create_element (document, "span", NULL);
                webkit_dom_range_surround_contents (range, WEBKIT_DOM_NODE (element_start), NULL);
                webkit_dom_dom_selection_modify (dom_selection, "move", "left", "character");
+               g_object_unref (range);
                range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
                element_end = webkit_dom_document_create_element (document, "span", NULL);
                webkit_dom_range_surround_contents (range, WEBKIT_DOM_NODE (element_end), NULL);
@@ -2615,6 +2666,9 @@ save_history_for_input (EHTMLEditorView *view)
                        NULL);
        }
 
+       g_object_unref (dom_selection);
+       g_object_unref (range);
+       g_object_unref (range_clone);
 
        unblock_selection_changed_callbacks (view);
 
@@ -2665,6 +2719,7 @@ body_input_event_cb (WebKitDOMElement *element,
                view->priv->undo_redo_in_progress = FALSE;
                view->priv->dont_save_history_in_body_input = FALSE;
                e_html_editor_view_force_spell_check_for_current_paragraph (view);
+               g_object_unref (range);
                return;
        }
 
@@ -2832,9 +2887,7 @@ body_input_event_cb (WebKitDOMElement *element,
                gint citation_level;
                WebKitDOMElement *selection_start_marker, *selection_end_marker;
                WebKitDOMNode *node, *parent;
-               WebKitDOMRange *range;
 
-               range = html_editor_view_get_dom_range (view);
                node = webkit_dom_range_get_end_container (range, NULL);
 
                citation_level = get_citation_level (node, FALSE);
@@ -2941,6 +2994,7 @@ body_input_event_cb (WebKitDOMElement *element,
                }
                e_html_editor_selection_restore (selection);
        }
+       g_object_unref (range);
 }
 
 static void
@@ -4018,14 +4072,20 @@ save_history_for_delete_or_backspace (EHTMLEditorView *view,
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
        dom_window = webkit_dom_document_get_default_view (document);
        dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
 
-       if (!webkit_dom_dom_selection_get_range_count (dom_selection))
+       if (!webkit_dom_dom_selection_get_range_count (dom_selection)) {
+               g_object_unref (dom_selection);
                return;
+       }
 
        range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
 
-       if (save_history_before_event_in_table (view, range))
+       if (save_history_before_event_in_table (view, range)) {
+               g_object_unref (range);
+               g_object_unref (dom_selection);
                return;
+       }
 
        selection = e_html_editor_view_get_selection (view);
 
@@ -4034,6 +4094,7 @@ save_history_for_delete_or_backspace (EHTMLEditorView *view,
 
        e_html_editor_selection_get_selection_coordinates (
                selection, &ev->before.start.x, &ev->before.start.y, &ev->before.end.x, &ev->before.end.y);
+       g_object_unref (range);
        range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
 
        if (webkit_dom_range_get_collapsed (range, NULL)) {
@@ -4058,9 +4119,12 @@ save_history_for_delete_or_backspace (EHTMLEditorView *view,
                }
 
                fragment = webkit_dom_range_clone_contents (range_clone, NULL);
+               g_object_unref (range_clone);
                if (!webkit_dom_node_get_first_child (WEBKIT_DOM_NODE (fragment))) {
                        g_free (ev);
                        unblock_selection_changed_callbacks (view);
+                       g_object_unref (range);
+                       g_object_unref (dom_selection);
                        return;
                }
 
@@ -4114,6 +4178,9 @@ save_history_for_delete_or_backspace (EHTMLEditorView *view,
                fragment = webkit_dom_range_clone_contents (range, NULL);
        }
 
+       g_object_unref (range);
+       g_object_unref (dom_selection);
+
        ev->data.fragment = fragment;
        e_html_editor_view_insert_new_history_event (view, ev);
 }
@@ -4142,12 +4209,17 @@ split_citation (EHTMLEditorView *view)
                document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
                dom_window = webkit_dom_document_get_default_view (document);
                dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+               g_object_unref (dom_window);
 
-               if (!webkit_dom_dom_selection_get_range_count (dom_selection))
+               if (!webkit_dom_dom_selection_get_range_count (dom_selection)) {
+                       g_object_unref (dom_selection);
                        return FALSE;
+               }
 
                range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
                fragment = webkit_dom_range_clone_contents (range, NULL);
+               g_object_unref (range);
+               g_object_unref (dom_selection);
 
                ev->data.fragment = fragment;
        } else
@@ -4168,13 +4240,14 @@ selection_is_in_table (WebKitDOMDocument *document,
                        gboolean *first_cell,
                        WebKitDOMNode **table_node)
 {
-       WebKitDOMDOMWindow *window;
-       WebKitDOMDOMSelection *selection;
+       WebKitDOMDOMWindow *dom_window;
+       WebKitDOMDOMSelection *dom_selection;
        WebKitDOMNode *node, *parent;
        WebKitDOMRange *range;
 
-       window = webkit_dom_document_get_default_view (document);
-       selection = webkit_dom_dom_window_get_selection (window);
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
 
        if (first_cell != NULL)
                *first_cell = FALSE;
@@ -4182,11 +4255,15 @@ selection_is_in_table (WebKitDOMDocument *document,
        if (table_node != NULL)
                *table_node = NULL;
 
-       if (webkit_dom_dom_selection_get_range_count (selection) < 1)
+       if (webkit_dom_dom_selection_get_range_count (dom_selection) < 1) {
+               g_object_unref (dom_selection);
                return FALSE;
+       }
 
-       range = webkit_dom_dom_selection_get_range_at (selection, 0, NULL);
+       range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
        node = webkit_dom_range_get_start_container (range, NULL);
+       g_object_unref (range);
+       g_object_unref (dom_selection);
 
        parent = node;
        while (parent && !WEBKIT_DOM_IS_HTML_BODY_ELEMENT (parent)) {
@@ -4232,8 +4309,8 @@ jump_to_next_table_cell (EHTMLEditorView *view,
                          gboolean jump_back)
 {
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
-       WebKitDOMDOMSelection *selection;
+       WebKitDOMDOMWindow *dom_window;
+       WebKitDOMDOMSelection *dom_selection;
        WebKitDOMNode *node, *cell;
        WebKitDOMRange *range;
 
@@ -4241,9 +4318,10 @@ jump_to_next_table_cell (EHTMLEditorView *view,
        if (!selection_is_in_table (document, NULL, NULL))
                return FALSE;
 
-       window = webkit_dom_document_get_default_view (document);
-       selection = webkit_dom_dom_window_get_selection (window);
-       range = webkit_dom_dom_selection_get_range_at (selection, 0, NULL);
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
+       range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
        node = webkit_dom_range_get_start_container (range, NULL);
 
        cell = node;
@@ -4251,8 +4329,11 @@ jump_to_next_table_cell (EHTMLEditorView *view,
                cell = webkit_dom_node_get_parent_node (cell);
        }
 
-       if (!WEBKIT_DOM_IS_HTML_TABLE_CELL_ELEMENT (cell))
+       if (!WEBKIT_DOM_IS_HTML_TABLE_CELL_ELEMENT (cell)) {
+               g_object_unref (range);
+               g_object_unref (dom_selection);
                return FALSE;
+       }
 
        if (jump_back) {
                /* Get previous cell */
@@ -4297,8 +4378,10 @@ jump_to_next_table_cell (EHTMLEditorView *view,
 
        webkit_dom_range_select_node_contents (range, node, NULL);
        webkit_dom_range_collapse (range, TRUE, NULL);
-       webkit_dom_dom_selection_remove_all_ranges (selection);
-       webkit_dom_dom_selection_add_range (selection, range);
+       webkit_dom_dom_selection_remove_all_ranges (dom_selection);
+       webkit_dom_dom_selection_add_range (dom_selection, range);
+       g_object_unref (range);
+       g_object_unref (dom_selection);
 
        return TRUE;
 }
@@ -6597,6 +6680,8 @@ html_editor_convert_view_content (EHTMLEditorView *view,
                FALSE,
                view);
 
+       g_object_unref (dom_window);
+
        register_html_events_handlers (view, body);
 
        g_free (inner_html);
@@ -8906,7 +8991,6 @@ html_editor_view_load_status_changed (EHTMLEditorView *view)
        view->priv->reload_in_progress = FALSE;
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
-       dom_window = webkit_dom_document_get_default_view (document);
        body = webkit_dom_document_get_body (document);
 
        webkit_dom_element_remove_attribute (WEBKIT_DOM_ELEMENT (body), "style");
@@ -8970,6 +9054,8 @@ html_editor_view_load_status_changed (EHTMLEditorView *view)
        else
                e_html_editor_view_turn_spell_check_off (view);
 
+       dom_window = webkit_dom_document_get_default_view (document);
+
        webkit_dom_event_target_add_event_listener (
                WEBKIT_DOM_EVENT_TARGET (dom_window),
                "scroll",
@@ -8977,6 +9063,8 @@ html_editor_view_load_status_changed (EHTMLEditorView *view)
                FALSE,
                view);
 
+       g_object_unref (dom_window);
+
 }
 
 static void
@@ -9195,8 +9283,8 @@ html_editor_view_drag_end_cb (EHTMLEditorView *view,
 {
        gint ii, length;
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
-       WebKitDOMDOMSelection *selection;
+       WebKitDOMDOMWindow *dom_window;
+       WebKitDOMDOMSelection *dom_selection;
        WebKitDOMNodeList *list;
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
@@ -9225,14 +9313,17 @@ html_editor_view_drag_end_cb (EHTMLEditorView *view,
 
        /* When the image is moved the new selection is created after after it, so
         * lets collapse the selection to have the caret right after the image. */
-       window = webkit_dom_document_get_default_view (document);
-       selection = webkit_dom_dom_window_get_selection (window);
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
        if (length > 0)
-               webkit_dom_dom_selection_collapse_to_start (selection, NULL);
+               webkit_dom_dom_selection_collapse_to_start (dom_selection, NULL);
        else
-               webkit_dom_dom_selection_collapse_to_end (selection, NULL);
+               webkit_dom_dom_selection_collapse_to_end (dom_selection, NULL);
 
        e_html_editor_view_force_spell_check_in_viewport (view);
+
+       g_object_unref (dom_selection);
+       g_object_unref (dom_window);
 }
 
 static void
@@ -10489,6 +10580,7 @@ e_html_editor_view_check_magic_links (EHTMLEditorView *view,
 
        range = html_editor_view_get_dom_range (view);
        html_editor_view_check_magic_links (view, range, include_space);
+       g_object_unref (range);
 }
 
 void
@@ -10628,15 +10720,17 @@ get_range_for_point (WebKitDOMDocument *document,
 
        /* The point is outside the viewport, scroll to it. */
        if (!range) {
-               WebKitDOMDOMWindow *window;
+               WebKitDOMDOMWindow *dom_window;
 
-               window = webkit_dom_document_get_default_view (document);
-               webkit_dom_dom_window_scroll_to (window, point.x, point.y);
+               dom_window = webkit_dom_document_get_default_view (document);
+               webkit_dom_dom_window_scroll_to (dom_window, point.x, point.y);
 
                scroll_left = webkit_dom_element_get_scroll_left (WEBKIT_DOM_ELEMENT (body));
                scroll_top = webkit_dom_element_get_scroll_top (WEBKIT_DOM_ELEMENT (body));
+               g_object_unref (range);
                range = webkit_dom_document_caret_range_from_point (
                        document, point.x - scroll_left, point.y - scroll_top);
+               g_object_unref (dom_window);
        }
 
        return range;
@@ -10657,17 +10751,21 @@ restore_selection_to_history_event_state (EHTMLEditorView *view,
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
        dom_window = webkit_dom_document_get_default_view (document);
        dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
 
        /* Restore the selection how it was before the event occured. */
        selection = e_html_editor_view_get_selection (view);
        range = get_range_for_point (document, selection_state.start);
        webkit_dom_dom_selection_remove_all_ranges (dom_selection);
        webkit_dom_dom_selection_add_range (dom_selection, range);
+       g_object_unref (range);
 
        was_collapsed = selection_state.start.x == selection_state.end.x;
        was_collapsed = was_collapsed &&  selection_state.start.y == selection_state.end.y;
-       if (was_collapsed)
+       if (was_collapsed) {
+               g_object_unref (dom_selection);
                return;
+       }
 
        e_html_editor_selection_save (selection);
 
@@ -10684,6 +10782,7 @@ restore_selection_to_history_event_state (EHTMLEditorView *view,
        range = get_range_for_point (document, selection_state.end);
        webkit_dom_dom_selection_remove_all_ranges (dom_selection);
        webkit_dom_dom_selection_add_range (dom_selection, range);
+       g_object_unref (range);
 
        e_html_editor_selection_save (selection);
 
@@ -10696,6 +10795,8 @@ restore_selection_to_history_event_state (EHTMLEditorView *view,
                element, "-x-evo-selection-start-marker");
 
        e_html_editor_selection_restore (selection);
+
+       g_object_unref (dom_selection);
 }
 
 static void
@@ -10714,6 +10815,7 @@ undo_delete (EHTMLEditorView *view,
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
        dom_window = webkit_dom_document_get_default_view (document);
        dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
 
        fragment = webkit_dom_node_clone_node (WEBKIT_DOM_NODE (event->data.fragment),  TRUE);
        first_child = webkit_dom_node_get_first_child (fragment);
@@ -10744,8 +10846,10 @@ undo_delete (EHTMLEditorView *view,
                range = get_range_for_point (document, event->before.start);
                webkit_dom_dom_selection_remove_all_ranges (dom_selection);
                webkit_dom_dom_selection_add_range (dom_selection, range);
+               g_object_unref (dom_selection);
 
                node = webkit_dom_range_get_start_container (range, NULL);
+               g_object_unref (range);
                if (!node)
                        return;
 
@@ -10774,6 +10878,7 @@ undo_delete (EHTMLEditorView *view,
                range = get_range_for_point (document, event->before.start);
                webkit_dom_dom_selection_remove_all_ranges (dom_selection);
                webkit_dom_dom_selection_add_range (dom_selection, range);
+               g_object_unref (range);
                e_html_editor_selection_save (selection);
 
                element = webkit_dom_document_get_element_by_id (
@@ -10885,8 +10990,11 @@ undo_delete (EHTMLEditorView *view,
 
                html_editor_view_check_magic_smileys (view, range);
                html_editor_view_check_magic_links (view, range, FALSE);
+               g_object_unref (range);
                e_html_editor_view_force_spell_check_for_current_paragraph (view);
        }
+
+       g_object_unref (dom_selection);
 }
 
 static void
@@ -10894,14 +11002,10 @@ redo_delete (EHTMLEditorView *view,
             EHTMLEditorViewHistoryEvent *event)
 {
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *dom_window;
-       WebKitDOMDOMSelection *dom_selection;
        WebKitDOMDocumentFragment *fragment = event->data.fragment;
        WebKitDOMNode *first_child;
 
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
-       dom_window = webkit_dom_document_get_default_view (document);
-       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
 
        first_child = webkit_dom_node_get_first_child (WEBKIT_DOM_NODE (fragment));
 
@@ -10909,6 +11013,12 @@ redo_delete (EHTMLEditorView *view,
 
        if (webkit_dom_document_fragment_query_selector (fragment, "span#-x-evo-selection-start-marker", 
NULL)) {
                gboolean delete = FALSE;
+               WebKitDOMDOMWindow *dom_window;
+               WebKitDOMDOMSelection *dom_selection;
+
+               dom_window = webkit_dom_document_get_default_view (document);
+               g_object_unref (dom_window);
+               dom_selection = webkit_dom_dom_window_get_selection (dom_window);
 
                /* Check if the event was delete or backspace press. */
                delete = WEBKIT_DOM_IS_ELEMENT (first_child);
@@ -10917,6 +11027,8 @@ redo_delete (EHTMLEditorView *view,
                        webkit_dom_dom_selection_modify (dom_selection, "extend", "right", "character");
                else
                        webkit_dom_dom_selection_modify (dom_selection, "extend", "left", "character");
+
+               g_object_unref (dom_selection);
        }
 
        e_html_editor_view_exec_command (view, E_HTML_EDITOR_VIEW_COMMAND_DELETE, NULL);
@@ -11039,6 +11151,7 @@ undo_redo_wrap (EHTMLEditorView *view,
 
                range = html_editor_view_get_dom_range (view);
                node = webkit_dom_range_get_common_ancestor_container (range, NULL);
+               g_object_unref (range);
                element = get_parent_block_element (WEBKIT_DOM_NODE (node));
                remove_wrapping_from_element (WEBKIT_DOM_ELEMENT (element));
 
@@ -11352,10 +11465,14 @@ undo_redo_table_input (EHTMLEditorView *view,
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
        dom_window = webkit_dom_document_get_default_view (document);
        dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
 
-       if (!webkit_dom_dom_selection_get_range_count (dom_selection))
+       if (!webkit_dom_dom_selection_get_range_count (dom_selection)) {
+               g_object_unref (dom_selection);
                return;
+       }
        range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
+       g_object_unref (dom_selection);
 
        /* Find if writing into table. */
        node = webkit_dom_range_get_start_container (range, NULL);
@@ -11364,6 +11481,8 @@ undo_redo_table_input (EHTMLEditorView *view,
        else
                element = get_parent_block_element (node);
 
+       g_object_unref (range);
+
        /* If writing to table we have to create different history event. */
        if (!WEBKIT_DOM_IS_HTML_TABLE_CELL_ELEMENT (element))
                return;
@@ -11428,11 +11547,13 @@ undo_redo_paste (EHTMLEditorView *view,
 
                        dom_window = webkit_dom_document_get_default_view (document);
                        dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+                       g_object_unref (dom_window);
 
                        /* Restore the selection how it was before the event occured. */
                        range = get_range_for_point (document, event->before.start);
                        webkit_dom_dom_selection_remove_all_ranges (dom_selection);
                        webkit_dom_dom_selection_add_range (dom_selection, range);
+                       g_object_unref (range);
 
                        e_html_editor_selection_save (selection);
 
@@ -11449,6 +11570,8 @@ undo_redo_paste (EHTMLEditorView *view,
                        range = get_range_for_point (document, event->after.start);
                        webkit_dom_dom_selection_remove_all_ranges (dom_selection);
                        webkit_dom_dom_selection_add_range (dom_selection, range);
+                       g_object_unref (range);
+                       g_object_unref (dom_selection);
 
                        e_html_editor_selection_save (selection);
 
@@ -11497,6 +11620,7 @@ undo_redo_image (EHTMLEditorView *view,
        document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
        dom_window = webkit_dom_document_get_default_view (document);
        dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
 
        if (undo) {
                WebKitDOMElement *element;
@@ -11505,6 +11629,7 @@ undo_redo_image (EHTMLEditorView *view,
                range = get_range_for_point (document, event->before.start);
                webkit_dom_dom_selection_remove_all_ranges (dom_selection);
                webkit_dom_dom_selection_add_range (dom_selection, range);
+               g_object_unref (range);
 
                e_html_editor_selection_save (selection);
                element = webkit_dom_document_get_element_by_id (
@@ -11524,6 +11649,7 @@ undo_redo_image (EHTMLEditorView *view,
                /* Create temporary node on the selection where the delete occured. */
                webkit_dom_dom_selection_remove_all_ranges (dom_selection);
                webkit_dom_dom_selection_add_range (dom_selection, range);
+               g_object_unref (range);
 
                e_html_editor_selection_save (selection);
                element = webkit_dom_document_get_element_by_id (
@@ -11539,6 +11665,8 @@ undo_redo_image (EHTMLEditorView *view,
                e_html_editor_selection_restore (selection);
                e_html_editor_view_force_spell_check_for_current_paragraph (view);
        }
+
+       g_object_unref (dom_selection);
 }
 
 static void
@@ -11556,8 +11684,10 @@ undo_redo_replace (EHTMLEditorView *view,
                document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
                dom_window = webkit_dom_document_get_default_view (document);
                dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+               g_object_unref (dom_window);
 
                webkit_dom_dom_selection_modify (dom_selection, "extend", "left", "word");
+               g_object_unref (dom_selection);
        }
 
        e_html_editor_view_exec_command (
@@ -11611,6 +11741,8 @@ undo_redo_replace_all (EHTMLEditorView *view,
                        dom_window = webkit_dom_document_get_default_view (document);
                        dom_selection = webkit_dom_dom_window_get_selection (dom_window);
                        webkit_dom_dom_selection_collapse_to_end (dom_selection, NULL);
+                       g_object_unref (dom_window);
+                       g_object_unref (dom_selection);
                }
        } else {
                /* Find if this history item is part of HISTORY_REPLACE_ALL. */
@@ -11681,12 +11813,15 @@ undo_redo_remove_link (EHTMLEditorView *view,
                range = html_editor_view_get_dom_range (view);
                element = webkit_dom_document_create_element (document, "SPAN", NULL);
                webkit_dom_range_surround_contents (range, WEBKIT_DOM_NODE (element), NULL);
+               g_object_unref (range);
                webkit_dom_node_insert_before (
                        webkit_dom_node_get_parent_node (WEBKIT_DOM_NODE (element)),
                        webkit_dom_node_clone_node (WEBKIT_DOM_NODE (event->data.fragment), TRUE),
                        WEBKIT_DOM_NODE (element),
                        NULL);
                remove_node (WEBKIT_DOM_NODE (element));
+               g_object_unref (dom_window);
+               g_object_unref (dom_selection);
        } else
                e_html_editor_selection_unlink (selection);
 
@@ -11716,6 +11851,9 @@ undo_input (EHTMLEditorView *view,
        }
        e_html_editor_view_exec_command (
                view, E_HTML_EDITOR_VIEW_COMMAND_DELETE, NULL);
+
+       g_object_unref (dom_window);
+       g_object_unref (dom_selection);
 }
 
 static void
diff --git a/e-util/e-web-view.c b/e-util/e-web-view.c
index d3ca20d..600eda8 100644
--- a/e-util/e-web-view.c
+++ b/e-util/e-web-view.c
@@ -2483,21 +2483,22 @@ static gchar *
 web_view_get_frame_selection_html (WebKitDOMElement *iframe)
 {
        WebKitDOMDocument *document;
-       WebKitDOMDOMWindow *window;
-       WebKitDOMDOMSelection *selection;
+       WebKitDOMDOMWindow *dom_window;
+       WebKitDOMDOMSelection *dom_selection;
        WebKitDOMNodeList *frames;
        gulong ii, length;
 
        document = webkit_dom_html_iframe_element_get_content_document (
                WEBKIT_DOM_HTML_IFRAME_ELEMENT (iframe));
-       window = webkit_dom_document_get_default_view (document);
-       selection = webkit_dom_dom_window_get_selection (window);
-       if (selection && (webkit_dom_dom_selection_get_range_count (selection) > 0)) {
+       dom_window = webkit_dom_document_get_default_view (document);
+       dom_selection = webkit_dom_dom_window_get_selection (dom_window);
+       g_object_unref (dom_window);
+       if (dom_selection && (webkit_dom_dom_selection_get_range_count (dom_selection) > 0)) {
                WebKitDOMRange *range;
                WebKitDOMElement *element;
                WebKitDOMDocumentFragment *fragment;
 
-               range = webkit_dom_dom_selection_get_range_at (selection, 0, NULL);
+               range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL);
                if (range != NULL) {
                        gchar *inner_html;
                        WebKitDOMNode *node;
@@ -2520,10 +2521,14 @@ web_view_get_frame_selection_html (WebKitDOMElement *iframe)
                                g_free (tmp);
                        }
 
+                       g_object_unref (range);
+                       g_object_unref (dom_selection);
                        return inner_html;
                }
        }
 
+       g_object_unref (dom_selection);
+
        frames = webkit_dom_document_get_elements_by_tag_name (
                document, "IFRAME");
        length = webkit_dom_node_list_get_length (frames);


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