[evolution] Possible deadlock in the replace dialog
- From: Tomas Popela <tpopela src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] Possible deadlock in the replace dialog
- Date: Thu, 23 Mar 2017 16:50:55 +0000 (UTC)
commit c467b11ebcf5f0b7c94b3c25108398c5f801562c
Author: Tomas Popela <tpopela redhat com>
Date: Thu Mar 23 17:44:11 2017 +0100
Possible deadlock in the replace dialog
We could get into the state where the Evolution was waiting until some
web process operation will finish, but the web process was waiting for
something from the UI Process (Evolution) - in this case spell check.
To avoid it move to the next word while doing 'replace all' only on
idle.
src/modules/webkit-editor/e-webkit-editor.c | 16 ++++++++++++++--
1 files changed, 14 insertions(+), 2 deletions(-)
---
diff --git a/src/modules/webkit-editor/e-webkit-editor.c b/src/modules/webkit-editor/e-webkit-editor.c
index bf52913..71023a0 100644
--- a/src/modules/webkit-editor/e-webkit-editor.c
+++ b/src/modules/webkit-editor/e-webkit-editor.c
@@ -2546,6 +2546,14 @@ webkit_editor_replace (EContentEditor *editor,
wk_editor->priv->cancellable);
}
+static gboolean
+search_next_on_idle (EWebKitEditor *wk_editor)
+{
+ webkit_find_controller_search_next (wk_editor->priv->find_controller);
+
+ return G_SOURCE_REMOVE;
+}
+
static void
webkit_find_controller_found_text_cb (WebKitFindController *find_controller,
guint match_count,
@@ -2560,9 +2568,13 @@ webkit_find_controller_found_text_cb (WebKitFindController *find_controller,
/* Repeatedly search for 'word', then replace selection by
* 'replacement'. Repeat until there's at least one occurrence of
* 'word' in the document */
- webkit_editor_replace (E_CONTENT_EDITOR (wk_editor), wk_editor->priv->replace_with);
+ e_util_invoke_g_dbus_proxy_call_with_error_check (
+ wk_editor->priv->web_extension,
+ "DOMSelectionReplace",
+ g_variant_new ("(ts)", current_page_id (wk_editor), wk_editor->priv->replace_with),
+ wk_editor->priv->cancellable);
- webkit_find_controller_search_next (find_controller);
+ g_idle_add ((GSourceFunc) search_next_on_idle, wk_editor);
} else {
e_content_editor_emit_find_done (E_CONTENT_EDITOR (wk_editor), match_count);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]