summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/editing/other/inserthtml-do-not-preserve-inline-styles.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/editing/other/inserthtml-do-not-preserve-inline-styles.html')
-rw-r--r--testing/web-platform/tests/editing/other/inserthtml-do-not-preserve-inline-styles.html176
1 files changed, 176 insertions, 0 deletions
diff --git a/testing/web-platform/tests/editing/other/inserthtml-do-not-preserve-inline-styles.html b/testing/web-platform/tests/editing/other/inserthtml-do-not-preserve-inline-styles.html
new file mode 100644
index 0000000000..3483f8f995
--- /dev/null
+++ b/testing/web-platform/tests/editing/other/inserthtml-do-not-preserve-inline-styles.html
@@ -0,0 +1,176 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+<meta name="timeout" content="long">
+<meta name="variant" content="?stylesAtInsertionPoint=bold&stylesInserting=italic">
+<meta name="variant" content="?stylesAtInsertionPoint=bold&stylesInserting=strikethrough">
+<meta name="variant" content="?stylesAtInsertionPoint=bold&stylesInserting=subscript">
+<meta name="variant" content="?stylesAtInsertionPoint=bold&stylesInserting=superscript">
+<meta name="variant" content="?stylesAtInsertionPoint=bold&stylesInserting=underline">
+<meta name="variant" content="?stylesAtInsertionPoint=bold&stylesInserting=fontname">
+<meta name="variant" content="?stylesAtInsertionPoint=bold&stylesInserting=fontsize">
+<meta name="variant" content="?stylesAtInsertionPoint=bold&stylesInserting=forecolor">
+<meta name="variant" content="?stylesAtInsertionPoint=bold&stylesInserting=hilitecolor">
+<meta name="variant" content="?stylesAtInsertionPoint=italic&stylesInserting=bold">
+<meta name="variant" content="?stylesAtInsertionPoint=strikethrough&stylesInserting=bold">
+<meta name="variant" content="?stylesAtInsertionPoint=subscript&stylesInserting=bold">
+<meta name="variant" content="?stylesAtInsertionPoint=superscript&stylesInserting=bold">
+<meta name="variant" content="?stylesAtInsertionPoint=underline&stylesInserting=bold">
+<meta name="variant" content="?stylesAtInsertionPoint=fontname&stylesInserting=bold">
+<meta name="variant" content="?stylesAtInsertionPoint=forecolor&stylesInserting=bold">
+<meta name="variant" content="?stylesAtInsertionPoint=hilitecolor&stylesInserting=bold">
+<meta name="variant" content="?stylesAtInsertionPoint=bold,italic&stylesInserting=strikethrough,underline">
+<title>insertHTML should not preserve inline styles at insertion point</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../include/editor-test-utils.js"></script>
+</head>
+<body><div contenteditable></div>
+<script>
+"use strict";
+
+const params = new URLSearchParams(location.search.substring(1));
+const stylesAtInsertionPoint = params.get("stylesAtInsertionPoint").split(",");
+const stylesInserting = params.get("stylesInserting").split(",");
+
+function getOpenTagForStyle(style) {
+ switch (style.toLowerCase()) {
+ case "bold":
+ return "<b>";
+ case "italic":
+ return "<i>";
+ case "strikethrough":
+ return "<s>";
+ case "subscript":
+ return "<sub>";
+ case "superscript":
+ return "<sup>";
+ case "underline":
+ return "<u>";
+ case "fontname":
+ return "<font face=\"monospace\">";
+ case "fontsize":
+ return "<font size=\"5\">";
+ case "forecolor":
+ return "<font color=\"#0000FF\">";
+ case "hilitecolor":
+ return "<span style=\"background-color:rgb(0, 255, 255)\">";
+ }
+}
+
+function getClosedTagForStyle(style) {
+ switch (style.toLowerCase()) {
+ case "bold":
+ return "</b>";
+ case "italic":
+ return "</i>";
+ case "strikethrough":
+ return "</s>";
+ case "subscript":
+ return "</sub>";
+ case "superscript":
+ return "</sup>";
+ case "underline":
+ return "</u>";
+ case "fontname":
+ case "fontsize":
+ case "forecolor":
+ return "</font>";
+ case "hilitecolor":
+ return "</span>";
+ }
+}
+
+function openTags(styles) {
+ let openTags = "";
+ for (const style of styles) {
+ openTags = getOpenTagForStyle(style) + openTags;
+ }
+ return openTags;
+}
+
+function closedTags(styles) {
+ let closedTags = "";
+ for (const style of styles) {
+ closedTags += getClosedTagForStyle(style);
+ }
+ return closedTags;
+}
+
+const editingHost = document.querySelector("div[contenteditable]");
+const utils = new EditorTestUtils(editingHost);
+
+function addTest(aTest) {
+ test(() => {
+ utils.setupEditingHost(aTest.innerHTML);
+ document.execCommand("insertHTML", false, aTest.newContent);
+ utils.normalizeStyleAttributeValues();
+ assert_equals(editingHost.innerHTML, aTest.expectedResult, aTest.description);
+ for (const style of stylesInserting) {
+ switch (style.toLocaleLowerCase()) {
+ case "fontsize":
+ assert_equals(
+ document.queryCommandValue(style),
+ "5",
+ `document.queryCommandValue("${style}")`
+ );
+ break;
+ case "fontname":
+ assert_equals(
+ document.queryCommandValue(style),
+ "monospace",
+ `document.queryCommandValue("${style}")`
+ );
+ break;
+ case "forecolor":
+ assert_equals(
+ document.queryCommandValue(style),
+ "rgb(0, 0, 255)",
+ `document.queryCommandValue("${style}")`
+ );
+ break;
+ case "hilitecolor":
+ assert_equals(
+ document.queryCommandValue(style),
+ "rgb(0, 255, 255))",
+ `document.queryCommandValue("${style}")`
+ );
+ break;
+ default:
+ assert_true(
+ document.queryCommandState(style),
+ `document.queryCommandState("${style}")`
+ );
+ break;
+ }
+ }
+ }, `insertHTML with "${aTest.newContent}" into ${aTest.innerHTML}`);
+}
+
+addTest({
+ innerHTML: `${openTags(stylesAtInsertionPoint)}[]def${closedTags(stylesAtInsertionPoint)}`,
+ newContent: `${openTags(stylesInserting)}abc${closedTags(stylesInserting)}`,
+ expectedResult: `${openTags(stylesInserting)}abc${closedTags(stylesInserting)}` +
+ `${openTags(stylesAtInsertionPoint)}def${closedTags(stylesAtInsertionPoint)}`,
+ description: "New content should be inserted before the inline containers",
+});
+addTest({
+ innerHTML: `${openTags(stylesAtInsertionPoint)}abc[]${closedTags(stylesAtInsertionPoint)}`,
+ newContent: `${openTags(stylesInserting)}def${closedTags(stylesInserting)}`,
+ expectedResult: `${openTags(stylesAtInsertionPoint)}abc${closedTags(stylesAtInsertionPoint)}` +
+ `${openTags(stylesInserting)}def${closedTags(stylesInserting)}`,
+ description: "New content should be appended after the inline containers",
+});
+addTest({
+ innerHTML: `${openTags(stylesAtInsertionPoint)}a[]c${closedTags(stylesAtInsertionPoint)}`,
+ newContent: `${openTags(stylesInserting)}b${closedTags(stylesInserting)}`,
+ expectedResult: `${openTags(stylesAtInsertionPoint)}a${closedTags(stylesAtInsertionPoint)}` +
+ `${openTags(stylesInserting)}b${closedTags(stylesInserting)}` +
+ `${openTags(stylesAtInsertionPoint)}c${closedTags(stylesAtInsertionPoint)}`,
+ description: "The inline containers should be split and new content inserted between them",
+});
+
+</script>
+</body>
+</html>