Blame SOURCES/evolution-3.28.5-mangled-deeper-html-quotes.patch

5bdb4f
diff -up evolution-3.28.5/src/e-util/test-html-editor-units-bugs.c.mangled-deeper-html-quotes evolution-3.28.5/src/e-util/test-html-editor-units-bugs.c
5bdb4f
--- evolution-3.28.5/src/e-util/test-html-editor-units-bugs.c.mangled-deeper-html-quotes	2018-07-30 15:37:05.000000000 +0200
5bdb4f
+++ evolution-3.28.5/src/e-util/test-html-editor-units-bugs.c	2018-09-03 15:31:08.028513879 +0200
5bdb4f
@@ -1205,6 +1205,120 @@ test_bug_750636 (TestFixture *fixture)
5bdb4f
 		g_test_fail ();
5bdb4f
 }
5bdb4f
 
5bdb4f
+static void
5bdb4f
+test_issue_86 (TestFixture *fixture)
5bdb4f
+{
5bdb4f
+	const gchar *source_text =
5bdb4f
+		"normal text\n"
5bdb4f
+		"\n"
5bdb4f
+		"> level 1\n"
5bdb4f
+		"> level 1\n"
5bdb4f
+		"> > level 2\n"
5bdb4f
+		"> > level 2\n"
5bdb4f
+		"> >\n"
5bdb4f
+		"> > level 2\n"
5bdb4f
+		">\n"
5bdb4f
+		"> level 1\n"
5bdb4f
+		"> level 1\n"
5bdb4f
+		">\n"
5bdb4f
+		"> > > level 3\n"
5bdb4f
+		"> > > level 3\n"
5bdb4f
+		">\n"
5bdb4f
+		"> > level 2\n"
5bdb4f
+		"> > level 2\n"
5bdb4f
+		">\n"
5bdb4f
+		"> level 1\n"
5bdb4f
+		"\n"
5bdb4f
+		"back normal text\n";
5bdb4f
+	gchar *converted, *to_insert;
5bdb4f
+
5bdb4f
+	if (!test_utils_process_commands (fixture,
5bdb4f
+		"mode:html\n")) {
5bdb4f
+		g_test_fail ();
5bdb4f
+		return;
5bdb4f
+	}
5bdb4f
+
5bdb4f
+	converted = camel_text_to_html (source_text,
5bdb4f
+		CAMEL_MIME_FILTER_TOHTML_PRE |
5bdb4f
+		CAMEL_MIME_FILTER_TOHTML_CONVERT_URLS |
5bdb4f
+		CAMEL_MIME_FILTER_TOHTML_CONVERT_ADDRESSES |
5bdb4f
+		CAMEL_MIME_FILTER_TOHTML_QUOTE_CITATION,
5bdb4f
+		0xDDDDDD);
5bdb4f
+
5bdb4f
+	g_return_if_fail (converted != NULL);
5bdb4f
+
5bdb4f
+	to_insert = g_strconcat (converted,
5bdb4f
+		""
5bdb4f
+		"",
5bdb4f
+		NULL);
5bdb4f
+
5bdb4f
+	test_utils_insert_content (fixture, to_insert,
5bdb4f
+		E_CONTENT_EDITOR_INSERT_REPLACE_ALL | E_CONTENT_EDITOR_INSERT_TEXT_HTML);
5bdb4f
+
5bdb4f
+	if (!test_utils_run_simple_test (fixture,
5bdb4f
+		"",
5bdb4f
+		HTML_PREFIX "
On Today, User wrote:
"
5bdb4f
+		"
"
5bdb4f
+			"
normal text
"
5bdb4f
+			"

"
5bdb4f
+			"
"
5bdb4f
+				"
level 1
"
5bdb4f
+				"
level 1
"
5bdb4f
+				"
"
5bdb4f
+					"
level 2
"
5bdb4f
+					"
level 2
"
5bdb4f
+					"

"
5bdb4f
+					"
level 2
"
5bdb4f
+				""
5bdb4f
+				"

"
5bdb4f
+				"
level 1
"
5bdb4f
+				"
level 1
"
5bdb4f
+				"

"
5bdb4f
+				"
"
5bdb4f
+					"
"
5bdb4f
+						"
level 3
"
5bdb4f
+						"
level 3
"
5bdb4f
+					""
5bdb4f
+				""
5bdb4f
+				"

"
5bdb4f
+				"
"
5bdb4f
+					"
level 2
"
5bdb4f
+					"
level 2
"
5bdb4f
+				""
5bdb4f
+				"

"
5bdb4f
+				"
level 1
"
5bdb4f
+			""
5bdb4f
+			"

"
5bdb4f
+			"
back normal text
"
5bdb4f
+		"" HTML_SUFFIX,
5bdb4f
+		"On Today, User wrote:\n"
5bdb4f
+		"> normal text\n"
5bdb4f
+		"> \n"
5bdb4f
+		"> > level 1\n"
5bdb4f
+		"> > level 1\n"
5bdb4f
+		"> > > level 2\n"
5bdb4f
+		"> > > level 2\n"
5bdb4f
+		"> > > \n"
5bdb4f
+		"> > > level 2\n"
5bdb4f
+		"> > \n"
5bdb4f
+		"> > level 1\n"
5bdb4f
+		"> > level 1\n"
5bdb4f
+		"> > \n"
5bdb4f
+		"> > > > level 3\n"
5bdb4f
+		"> > > > level 3\n"
5bdb4f
+		"> > \n"
5bdb4f
+		"> > > level 2\n"
5bdb4f
+		"> > > level 2\n"
5bdb4f
+		"> > \n"
5bdb4f
+		"> > level 1\n"
5bdb4f
+		"> \n"
5bdb4f
+		"> back normal text"))
5bdb4f
+		g_test_fail ();
5bdb4f
+
5bdb4f
+	g_free (to_insert);
5bdb4f
+	g_free (converted);
5bdb4f
+}
5bdb4f
+
5bdb4f
 void
5bdb4f
 test_add_html_editor_bug_tests (void)
5bdb4f
 {
5bdb4f
@@ -1234,4 +1348,5 @@ test_add_html_editor_bug_tests (void)
5bdb4f
 	test_utils_add_test ("/bug/780088", test_bug_780088);
5bdb4f
 	test_utils_add_test ("/bug/788829", test_bug_788829);
5bdb4f
 	test_utils_add_test ("/bug/750636", test_bug_750636);
5bdb4f
+	test_utils_add_test ("/issue/86", test_issue_86);
5bdb4f
 }
5bdb4f
diff -up evolution-3.28.5/src/modules/webkit-editor/web-extension/e-editor-dom-functions.c.mangled-deeper-html-quotes evolution-3.28.5/src/modules/webkit-editor/web-extension/e-editor-dom-functions.c
5bdb4f
--- evolution-3.28.5/src/modules/webkit-editor/web-extension/e-editor-dom-functions.c.mangled-deeper-html-quotes	2018-07-30 15:37:05.000000000 +0200
5bdb4f
+++ evolution-3.28.5/src/modules/webkit-editor/web-extension/e-editor-dom-functions.c	2018-09-03 15:32:41.220512591 +0200
5bdb4f
@@ -6230,7 +6230,6 @@ e_editor_dom_convert_content (EEditorPag
5bdb4f
 			WEBKIT_DOM_NODE (content_wrapper),
5bdb4f
 			WEBKIT_DOM_NODE (e_editor_dom_prepare_paragraph (editor_page, FALSE)),
5bdb4f
 			NULL);
5bdb4f
-
5bdb4f
 	if (!cite_body) {
5bdb4f
 		if (!empty) {
5bdb4f
 			WebKitDOMNode *child;
5bdb4f
@@ -8754,6 +8753,133 @@ adapt_to_editor_dom_changes (WebKitDOMDo
5bdb4f
 	g_clear_object (&collection);
5bdb4f
 }
5bdb4f
 
5bdb4f
+static void
5bdb4f
+traverse_nodes_to_split_pre (WebKitDOMDocument *document,
5bdb4f
+			     WebKitDOMNode *node,
5bdb4f
+			     WebKitDOMNode *new_parent, /* can be NULL, then prepend to out_new_nodes */
5bdb4f
+			     gboolean is_in_pre,
5bdb4f
+			     GSList **out_new_nodes) /* WebKitDOMNode * */
5bdb4f
+{
5bdb4f
+	if (is_in_pre && WEBKIT_DOM_IS_TEXT (node)) {
5bdb4f
+		gchar *text;
5bdb4f
+
5bdb4f
+		text = webkit_dom_text_get_whole_text (WEBKIT_DOM_TEXT (node));
5bdb4f
+		if (text) {
5bdb4f
+			WebKitDOMElement *pre;
5bdb4f
+			gint ii;
5bdb4f
+			gchar **strv;
5bdb4f
+
5bdb4f
+			strv = g_strsplit (text, "\n", -1);
5bdb4f
+
5bdb4f
+			for (ii = 0; strv && strv[ii]; ii++) {
5bdb4f
+				if (*(strv[ii])) {
5bdb4f
+					gint len = strlen (strv[ii]);
5bdb4f
+
5bdb4f
+					if (strv[ii][len - 1] == '\r') {
5bdb4f
+						strv[ii][len - 1] = '\0';
5bdb4f
+					}
5bdb4f
+				}
5bdb4f
+
5bdb4f
+				/* 
 is shown as a block, thus adding a new line at the end behaves like two 
-s */
5bdb4f
+				if (!*(strv[ii]) && !strv[ii + 1])
5bdb4f
+					break;
5bdb4f
+
5bdb4f
+				pre = webkit_dom_document_create_element (document, "pre", NULL);
5bdb4f
+
5bdb4f
+				if (*(strv[ii])) {
5bdb4f
+					webkit_dom_html_element_set_inner_text (WEBKIT_DOM_HTML_ELEMENT (pre), strv[ii], NULL);
5bdb4f
+				} else {
5bdb4f
+					WebKitDOMElement *br;
5bdb4f
+
5bdb4f
+					br = webkit_dom_document_create_element (document, "br", NULL);
5bdb4f
+					webkit_dom_node_append_child (WEBKIT_DOM_NODE (pre), WEBKIT_DOM_NODE (br), NULL);
5bdb4f
+				}
5bdb4f
+
5bdb4f
+				if (new_parent)
5bdb4f
+					webkit_dom_node_append_child (new_parent, WEBKIT_DOM_NODE (pre), NULL);
5bdb4f
+				else
5bdb4f
+					*out_new_nodes = g_slist_prepend (*out_new_nodes, pre);
5bdb4f
+			}
5bdb4f
+
5bdb4f
+			g_strfreev (strv);
5bdb4f
+		}
5bdb4f
+
5bdb4f
+		g_free (text);
5bdb4f
+	} else if (WEBKIT_DOM_IS_HTML_PRE_ELEMENT (node)) {
5bdb4f
+		is_in_pre = TRUE;
5bdb4f
+	} else {
5bdb4f
+		WebKitDOMNode *nd;
5bdb4f
+		GError *error = NULL;
5bdb4f
+
5bdb4f
+		nd = webkit_dom_node_clone_node_with_error (node, FALSE, &error);
5bdb4f
+		if (nd) {
5bdb4f
+			if (new_parent)
5bdb4f
+				webkit_dom_node_append_child (new_parent, nd, NULL);
5bdb4f
+			else
5bdb4f
+				*out_new_nodes = g_slist_prepend (*out_new_nodes, nd);
5bdb4f
+
5bdb4f
+			new_parent = nd;
5bdb4f
+		} else {
5bdb4f
+			g_warning ("%s: Failed to clone node %s: %s\n", G_STRFUNC, G_OBJECT_TYPE_NAME (node), error ? error->message : "Unknown error");
5bdb4f
+		}
5bdb4f
+	}
5bdb4f
+
5bdb4f
+	for (node = webkit_dom_node_get_first_child (node);
5bdb4f
+	     node;
5bdb4f
+	     node = webkit_dom_node_get_next_sibling (node)) {
5bdb4f
+		traverse_nodes_to_split_pre (document, node, new_parent, is_in_pre, out_new_nodes);
5bdb4f
+	}
5bdb4f
+}
5bdb4f
+
5bdb4f
+static void
5bdb4f
+maybe_split_pre_paragraphs (WebKitDOMDocument *document)
5bdb4f
+{
5bdb4f
+	WebKitDOMHTMLElement *body;
5bdb4f
+	WebKitDOMNodeList *list;
5bdb4f
+
5bdb4f
+	body = webkit_dom_document_get_body (document);
5bdb4f
+	if (!body)
5bdb4f
+		return;
5bdb4f
+
5bdb4f
+	list = webkit_dom_document_query_selector_all (document, "pre", NULL);
5bdb4f
+	if (webkit_dom_node_list_get_length (list)) {
5bdb4f
+		WebKitDOMNode *body_node, *node, *current;
5bdb4f
+		GSList *new_nodes = NULL, *to_remove = NULL, *link;
5bdb4f
+
5bdb4f
+		g_clear_object (&list);
5bdb4f
+
5bdb4f
+		body_node = WEBKIT_DOM_NODE (body);
5bdb4f
+		webkit_dom_node_normalize (body_node);
5bdb4f
+
5bdb4f
+		for (current = webkit_dom_node_get_first_child (body_node);
5bdb4f
+		     current;
5bdb4f
+		     current = webkit_dom_node_get_next_sibling (current)) {
5bdb4f
+			traverse_nodes_to_split_pre (document, current, NULL, FALSE, &new_nodes);
5bdb4f
+			to_remove = g_slist_prepend (to_remove, current);
5bdb4f
+		}
5bdb4f
+
5bdb4f
+		for (link = to_remove; link; link = g_slist_next (link)) {
5bdb4f
+			node = link->data;
5bdb4f
+
5bdb4f
+			webkit_dom_node_remove_child (body_node, node, NULL);
5bdb4f
+		}
5bdb4f
+
5bdb4f
+		/* They are in reverse order, thus reverse it */
5bdb4f
+		new_nodes = g_slist_reverse (new_nodes);
5bdb4f
+
5bdb4f
+		for (link = new_nodes; link; link = g_slist_next (link)) {
5bdb4f
+			node = link->data;
5bdb4f
+
5bdb4f
+			webkit_dom_node_append_child (body_node, node, NULL);
5bdb4f
+		}
5bdb4f
+
5bdb4f
+		g_slist_free (to_remove);
5bdb4f
+		g_slist_free (new_nodes);
5bdb4f
+	}
5bdb4f
+
5bdb4f
+	g_clear_object (&list);
5bdb4f
+}
5bdb4f
+
5bdb4f
 void
5bdb4f
 e_editor_dom_process_content_after_load (EEditorPage *editor_page)
5bdb4f
 {
5bdb4f
@@ -8803,60 +8929,8 @@ e_editor_dom_process_content_after_load
5bdb4f
 		}
5bdb4f
 
5bdb4f
 		goto out;
5bdb4f
-	} else {
5bdb4f
-		WebKitDOMNodeList *list;
5bdb4f
-		gulong ii;
5bdb4f
-
5bdb4f
-		list = webkit_dom_document_query_selector_all (document, "pre", NULL);
5bdb4f
-		for (ii = webkit_dom_node_list_get_length (list); ii--;) {
5bdb4f
-			WebKitDOMNode *node = webkit_dom_node_list_item (list, ii), *parent;
5bdb4f
-			WebKitDOMElement *element;
5bdb4f
-			gchar *inner_html;
5bdb4f
-
5bdb4f
-			element = WEBKIT_DOM_ELEMENT (node);
5bdb4f
-			parent = webkit_dom_node_get_parent_node (node);
5bdb4f
-			inner_html = webkit_dom_element_get_inner_html (element);
5bdb4f
-
5bdb4f
-			if (inner_html && *inner_html) {
5bdb4f
-				gchar **strv;
5bdb4f
-
5bdb4f
-				strv = g_strsplit (inner_html, "\n", -1);
5bdb4f
-				if (strv && strv[0] && strv[1]) {
5bdb4f
-					WebKitDOMElement *pre;
5bdb4f
-					gint jj;
5bdb4f
-
5bdb4f
-					for (jj = 0; strv[jj]; jj++) {
5bdb4f
-						pre = webkit_dom_document_create_element (document, "pre", NULL);
5bdb4f
-						if (*(strv[jj])) {
5bdb4f
-							gint len = strlen (strv[jj]);
5bdb4f
-
5bdb4f
-							if (strv[jj][len - 1] == '\r') {
5bdb4f
-								strv[jj][len - 1] = '\0';
5bdb4f
-							}
5bdb4f
-						}
5bdb4f
-
5bdb4f
-						if (*(strv[jj])) {
5bdb4f
-							webkit_dom_html_element_set_inner_html (WEBKIT_DOM_HTML_ELEMENT (pre), strv[jj], NULL);
5bdb4f
-						} else {
5bdb4f
-							WebKitDOMElement *br;
5bdb4f
-
5bdb4f
-							br = webkit_dom_document_create_element (document, "br", NULL);
5bdb4f
-							webkit_dom_node_append_child (WEBKIT_DOM_NODE (pre), WEBKIT_DOM_NODE (br), NULL);
5bdb4f
-						}
5bdb4f
-
5bdb4f
-						webkit_dom_node_insert_before (parent, WEBKIT_DOM_NODE (pre), node, NULL);
5bdb4f
-					}
5bdb4f
-
5bdb4f
-					remove_node (node);
5bdb4f
-				}
5bdb4f
-
5bdb4f
-				g_strfreev (strv);
5bdb4f
-			}
5bdb4f
-
5bdb4f
-			g_free (inner_html);
5bdb4f
-		}
5bdb4f
-
5bdb4f
-		g_clear_object (&list);
5bdb4f
+	} else if (!webkit_dom_element_has_attribute (WEBKIT_DOM_ELEMENT (body), "data-evo-draft")) {
5bdb4f
+		maybe_split_pre_paragraphs (document);
5bdb4f
 	}
5bdb4f
 
5bdb4f
 	adapt_to_editor_dom_changes (document);