Index: third_party/WebKit/LayoutTests/imported/wpt/editing/include/manualtest.js |
diff --git a/third_party/WebKit/LayoutTests/imported/wpt/editing/include/manualtest.js b/third_party/WebKit/LayoutTests/imported/wpt/editing/include/manualtest.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..504fdae4cc513efeba53c8a08d96558ccdac2bd4 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/imported/wpt/editing/include/manualtest.js |
@@ -0,0 +1,225 @@ |
+// Initial setup |
+//@{ |
+var globalValue; |
+if (globalValue === undefined) { |
+ globalValue = command in defaultValues ? defaultValues[command] : ""; |
+} |
+var keyPrefix = globalValue == "" |
+ ? "manualtest-" + command + "-" |
+ : "manualtest-" + command + "-" + globalValue + "-"; |
+(function(){ |
+ var manualTests = tests[command] |
+ .map(function(test) { return normalizeTest(command, test) }) |
+ .filter(function(test) { return test[1][1] == globalValue }); |
+ var relevantMultiTests = tests.multitest |
+ .map(function(test) { return normalizeTest("multitest", test) }) |
+ .filter(function(test) { |
+ // We only want multitests if there's exactly one occurrence of the |
+ // command we're testing for, and the value is correct, and that's |
+ // the last command we're testing. Some of these limitations could |
+ // be removed in the future. |
+ return test[test.length - 1][0] === command |
+ && test[test.length - 1][1] === globalValue; |
+ }); |
+ |
+ tests = manualTests.concat(relevantMultiTests); |
+})(); |
+//@} |
+ |
+function clearCachedResults() { |
+//@{ |
+ for (var key in localStorage) { |
+ if (key.indexOf(keyPrefix) === 0) { |
+ localStorage.removeItem(key); |
+ } |
+ } |
+} |
+//@} |
+ |
+var numManualTests = 0; |
+var currentTestIdx = null; |
+ |
+// Make sure styleWithCss is always reset to false at the start of a test run |
+// (I'm looking at you, Firefox) |
+try { document.execCommand("stylewithcss", false, "false") } catch(e) {} |
+ |
+function runTests() { |
+//@{ |
+ // We don't ask the user to hit a key on all tests, so make sure not to |
+ // claim more tests are going to be run than actually are. |
+ for (var i = 0; i < tests.length; i++) { |
+ if (localStorage.getItem(keyPrefix + JSON.stringify(tests[i])) === null) { |
+ numManualTests++; |
+ } |
+ } |
+ |
+ currentTestIdx = 0; |
+ |
+ var runTestsButton = document.querySelector("#tests input[type=button]"); |
+ runTestsButton.parentNode.removeChild(runTestsButton); |
+ |
+ var addTestButton = document.querySelector("#tests input[type=button]"); |
+ var input = document.querySelector("#tests label input"); |
+ // This code actually focuses and clicks everything because for some |
+ // reason, anything else doesn't work in IE9 . . . |
+ input.value = JSON.stringify(tests[0]); |
+ input.focus(); |
+ addTestButton.click(); |
+} |
+//@} |
+ |
+function addTest() { |
+//@{ |
+ var tr = doSetup("#tests table", 0); |
+ var input = document.querySelector("#tests label input"); |
+ var test = JSON.parse(input.value); |
+ doInputCell(tr, test, test.length == 2 ? command : "multitest"); |
+ doSpecCell(tr, test, test.length == 2 ? command : "multitest"); |
+ if (localStorage.getItem(keyPrefix + JSON.stringify(test)) !== null) { |
+ // Yay, I get to cheat. Remove the overlay div so the user doesn't |
+ // keep hitting the key, in case it takes a while. |
+ var browserCell = document.createElement("td"); |
+ tr.appendChild(browserCell); |
+ browserCell.innerHTML = localStorage[keyPrefix + JSON.stringify(test)]; |
+ doBrowserCellButton(browserCell, test); |
+ document.getElementById("overlay").style.display = ""; |
+ doSameCell(tr); |
+ runNextTest(test); |
+ } else { |
+ doBrowserCell(tr, test, function() { |
+ doSameCell(tr); |
+ runNextTest(); |
+ }); |
+ } |
+} |
+//@} |
+ |
+function runNextTest() { |
+//@{ |
+ doTearDown(); |
+ var input = document.querySelector("#tests label input"); |
+ if (currentTestIdx === null |
+ || currentTestIdx + 1 >= tests.length) { |
+ currentTestIdx = null; |
+ document.getElementById("overlay").style.display = ""; |
+ input.value = ""; |
+ return; |
+ } |
+ currentTestIdx++; |
+ input.value = JSON.stringify(tests[currentTestIdx]); |
+ input.focus(); |
+ addTest(); |
+} |
+//@} |
+ |
+function doBrowserCell(tr, test, callback) { |
+//@{ |
+ var browserCell = document.createElement("td"); |
+ tr.appendChild(browserCell); |
+ |
+ try { |
+ var points = setupCell(browserCell, test[0]); |
+ |
+ var testDiv = browserCell.firstChild; |
+ // Work around weird Firefox bug: |
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=649138 |
+ document.body.appendChild(testDiv); |
+ testDiv.onkeyup = function() { |
+ continueBrowserCell(test, testDiv, browserCell); |
+ callback(); |
+ }; |
+ testDiv.contentEditable = "true"; |
+ testDiv.spellcheck = false; |
+ if (currentTestIdx === null) { |
+ document.getElementById("testcount").style.display = "none"; |
+ } else { |
+ document.getElementById("testcount").style.display = ""; |
+ document.querySelector("#testcount > span").textContent = numManualTests; |
+ numManualTests--; |
+ } |
+ document.getElementById("overlay").style.display = "block"; |
+ testDiv.focus(); |
+ setSelection(points[0], points[1], points[2], points[3]); |
+ // Execute any extra commands beforehand, for multitests |
+ for (var i = 1; i < test.length - 1; i++) { |
+ document.execCommand(test[i][0], false, test[i][1]); |
+ } |
+ } catch (e) { |
+ browserCellException(e, testDiv, browserCell); |
+ callback(); |
+ } |
+} |
+//@} |
+ |
+function continueBrowserCell(test, testDiv, browserCell) { |
+//@{ |
+ try { |
+ testDiv.contentEditable = "inherit"; |
+ testDiv.removeAttribute("spellcheck"); |
+ var compareDiv1 = testDiv.cloneNode(true); |
+ |
+ if (getSelection().rangeCount) { |
+ addBrackets(getSelection().getRangeAt(0)); |
+ } |
+ browserCell.insertBefore(testDiv, browserCell.firstChild); |
+ |
+ if (!browserCell.childNodes.length == 2) { |
+ throw "The cell didn't have two children. Did something spill outside the test div?"; |
+ } |
+ |
+ compareDiv1.normalize(); |
+ // Sigh, Gecko is crazy |
+ var treeWalker = document.createTreeWalker(compareDiv1, NodeFilter.SHOW_ELEMENT, null, null); |
+ while (treeWalker.nextNode()) { |
+ var remove = [].filter.call(treeWalker.currentNode.attributes, function(attrib) { |
+ return /^_moz_/.test(attrib.name) || attrib.value == "_moz"; |
+ }); |
+ for (var i = 0; i < remove.length; i++) { |
+ treeWalker.currentNode.removeAttribute(remove[i].name); |
+ } |
+ } |
+ var compareDiv2 = compareDiv1.cloneNode(false); |
+ compareDiv2.innerHTML = compareDiv1.innerHTML; |
+ if (!compareDiv1.isEqualNode(compareDiv2) |
+ && compareDiv1.innerHTML != compareDiv2.innerHTML) { |
+ throw "DOM does not round-trip through serialization! " |
+ + compareDiv1.innerHTML + " vs. " + compareDiv2.innerHTML; |
+ } |
+ if (!compareDiv1.isEqualNode(compareDiv2)) { |
+ throw "DOM does not round-trip through serialization (although innerHTML is the same)! " |
+ + compareDiv1.innerHTML; |
+ } |
+ |
+ browserCell.lastChild.textContent = browserCell.firstChild.innerHTML; |
+ } catch (e) { |
+ browserCellException(e, testDiv, browserCell); |
+ } |
+ |
+ localStorage[keyPrefix + JSON.stringify(test)] = browserCell.innerHTML; |
+ |
+ doBrowserCellButton(browserCell, test); |
+} |
+//@} |
+ |
+function doBrowserCellButton(browserCell, test) { |
+//@{ |
+ var button = document.createElement("button"); |
+ browserCell.lastChild.appendChild(button); |
+ button.textContent = "Redo browser output"; |
+ button.onclick = function() { |
+ localStorage.removeItem(keyPrefix + JSON.stringify(test)); |
+ var tr = browserCell.parentNode; |
+ while (browserCell.nextSibling) { |
+ tr.removeChild(browserCell.nextSibling); |
+ } |
+ tr.removeChild(browserCell); |
+ doBrowserCell(tr, test, function() { |
+ doSameCell(tr); |
+ doTearDown(); |
+ document.getElementById("overlay").style.display = ""; |
+ tr.scrollIntoView(); |
+ }); |
+ }; |
+} |
+//@} |
+// vim: foldmarker=@{,@} foldmethod=marker |