diff options
Diffstat (limited to 'testing/web-platform/tests/html/semantics/forms/the-textarea-element')
32 files changed, 869 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/change-to-empty-value.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/change-to-empty-value.html new file mode 100644 index 0000000000..b3aa7b416d --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/change-to-empty-value.html @@ -0,0 +1,32 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Change event when clearing a textarea</title> +<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez"> +<link rel="author" href="https://mozilla.org" title="Mozilla"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1881457"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<textarea>abc</textarea> +<script> +promise_test(async function() { + let textarea = document.querySelector("textarea"); + let changeFired = false; + textarea.addEventListener("change", () => { + changeFired = true; + }, { once: true }); + + textarea.focus(); + assert_equals(document.activeElement, textarea, "Should focus textarea"); + assert_false(changeFired, "Shouldn't have fired change event after focus"); + textarea.select(); + const kBackspaceKey = "\uE003"; + await test_driver.send_keys(textarea, kBackspaceKey) + assert_false(changeFired, "Shouldn't have fired change event after select"); + textarea.blur(); + assert_true(changeFired, "Should've have fired change event after blur"); + assert_equals(textarea.value, "", "Should've have cleared the value"); +}); +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/cloning-steps.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/cloning-steps.html new file mode 100644 index 0000000000..7a85bd26a1 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/cloning-steps.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Cloning of textarea elements</title> +<link rel="help" href="https://dom.spec.whatwg.org/#dom-node-clonenode"> +<link rel="help" href="https://dom.spec.whatwg.org/#concept-node-clone"> +<link rel="help" href="https://dom.spec.whatwg.org/#concept-node-clone-ext"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/forms.html#the-textarea-element:concept-node-clone-ext"> +<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<script> +"use strict"; + +test(function() { + var textarea = document.createElement("textarea"); + textarea.value = "foo bar"; + + var copy = textarea.cloneNode(); + assert_equals(copy.value, "foo bar"); +}, "textarea element's value should be cloned"); + +test(function() { + var textarea = document.createElement("textarea"); + textarea.value = "foo bar"; + + var copy = textarea.cloneNode(); + copy.setAttribute("value", "something else"); + + assert_equals(copy.value, "foo bar"); +}, "textarea element's dirty value flag should be cloned, so setAttribute doesn't affect the cloned textarea's value"); + +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/multiline-placeholder-cr.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/multiline-placeholder-cr.html new file mode 100644 index 0000000000..08d0982ba5 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/multiline-placeholder-cr.html @@ -0,0 +1 @@ +<!doctype html>
<html class="reftest-wait">
<meta charset="utf-8">
<title>textarea multiline placeholder (CR)</title>
<link rel="help" href="https://html.spec.whatwg.org/multipage/form-elements.html#attr-textarea-placeholder">
<meta name="assert" content="textarea element's placeholder preserves newlines (CR)">
<link rel="match" href="multiline-placeholder-ref.html">
<link rel="stylesheet" href="support/placeholder.css">
<textarea rows="5" placeholder="this is
a multiline
placeholder"></textarea>
<textarea rows="5" placeholder="this is
a multiline

placeholder"></textarea>
<textarea rows="5" id="dynamic"></textarea>
<script>
document.querySelector("#dynamic")
.setAttribute("placeholder", "this is\ra multiline\r\rplaceholder");
document.documentElement.classList.remove("reftest-wait");
</script>
</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/multiline-placeholder-crlf.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/multiline-placeholder-crlf.html new file mode 100644 index 0000000000..b82a203076 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/multiline-placeholder-crlf.html @@ -0,0 +1,21 @@ +<!doctype html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<title>textarea multiline placeholder (CRLF)</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/form-elements.html#attr-textarea-placeholder">
+<meta name="assert" content="textarea element's placeholder preserves newlines (CRLF)">
+<link rel="match" href="multiline-placeholder-ref.html">
+<link rel="stylesheet" href="support/placeholder.css">
+<textarea rows="5" placeholder="this is
+a multiline
+
+placeholder"></textarea>
+<textarea rows="5" placeholder="this is
a multiline

placeholder"></textarea>
+<textarea rows="5" id="dynamic"></textarea>
+<script>
+ document.querySelector("#dynamic")
+ .setAttribute("placeholder", "this is\r\na multiline\r\n\r\nplaceholder");
+ document.documentElement.classList.remove("reftest-wait");
+</script>
+</html>
+
diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/multiline-placeholder-ref.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/multiline-placeholder-ref.html new file mode 100644 index 0000000000..0234ed64c9 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/multiline-placeholder-ref.html @@ -0,0 +1,15 @@ +<!doctype html> +<meta charset="utf-8"> +<link rel="stylesheet" href="support/placeholder.css"> +<textarea rows="5" class="placeholder">this is +a multiline + +placeholder</textarea> +<textarea rows="5" class="placeholder">this is +a multiline + +placeholder</textarea> +<textarea rows="5" class="placeholder">this is +a multiline + +placeholder</textarea> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/multiline-placeholder.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/multiline-placeholder.html new file mode 100644 index 0000000000..4e835a6f56 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/multiline-placeholder.html @@ -0,0 +1,22 @@ +<!doctype html> +<html class="reftest-wait"> +<meta charset="utf-8"> +<title>textarea multiline placeholder</title> +<link rel="help" href="https://html.spec.whatwg.org/multipage/form-elements.html#attr-textarea-placeholder"> +<meta name="assert" content="textarea element's placeholder preserves newlines"> +<link rel="match" href="multiline-placeholder-ref.html"> +<link rel="stylesheet" href="support/placeholder.css"> +<textarea rows="5" placeholder="this is +a multiline + +placeholder"></textarea> +<textarea rows="5" placeholder="this is
a multiline

placeholder"></textarea> +<textarea rows="5" id="dynamic"></textarea> +<script> + document.querySelector("#dynamic") + .setAttribute("placeholder", "this is\na multiline\n\nplaceholder"); + document.documentElement.classList.remove("reftest-wait"); +</script> +</html> + + diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/placeholder-white-space-notref.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/placeholder-white-space-notref.html new file mode 100644 index 0000000000..375bdef874 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/placeholder-white-space-notref.html @@ -0,0 +1,8 @@ +<!doctype html> +<title>CSS Test Reference</title> +<style> + textarea { + max-width: 100px; + } +</style> +<textarea placeholder="This is a really long string that needs to be truncated"></textarea> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/placeholder-white-space.tentative.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/placeholder-white-space.tentative.html new file mode 100644 index 0000000000..7af55643fb --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/placeholder-white-space.tentative.html @@ -0,0 +1,15 @@ +<!doctype html> +<meta charset=utf-8> +<title>Textarea placeholder honors textarea's text-overflow</title> +<link rel=author href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez"> +<link rel=author href="https://mozilla.com" title="Mozilla"> +<link rel=mismatch href="placeholder-white-space-notref.html"> +<link rel=help href="https://github.com/w3c/csswg-drafts/issues/6669"> +<style> + textarea { + white-space: nowrap; + text-overflow: ellipsis; + max-width: 100px; + } +</style> +<textarea placeholder="This is a really long string that needs to be truncated"></textarea> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/support/placeholder.css b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/support/placeholder.css new file mode 100644 index 0000000000..9aaed05c86 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/support/placeholder.css @@ -0,0 +1,6 @@ +textarea.placeholder, +textarea::placeholder { + /* revert browser styling of the placeholder */ + color: GrayText; /* blink/webkit use colour */ + opacity: 1.0; /* gecko uses opacity */ +} diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-maxlength.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-maxlength.html new file mode 100644 index 0000000000..3ea6739518 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-maxlength.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html> + +<head> + <title>textarea maxlength</title> + <link rel="author" title="tigercosmos" href="mailto:phy.tiger@gmail.com"> + <link rel=help href="https://html.spec.whatwg.org/multipage/#attr-textarea-maxlength"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> + +<body> + + <textarea id="none"></textarea> + <textarea id="negative" maxlength="-5"></textarea> + <textarea id="non-numeric" maxlength="not-a-number"></textarea> + <textarea id="assign-negative"></textarea> + <textarea id="assign-non-numeric"></textarea> + + <script> + test( + function () { + assert_equals(document.getElementById("none").maxLength, -1); + }, "Unset maxlength is -1"); + + test( + function () { + assert_equals(document.getElementById("negative").maxLength, -1); + }, "Negative maxlength is always -1"); + + test( + function () { + assert_equals(document.getElementById("non-numeric").maxLength, -1); + }, "Non-numeric maxlength is -1"); + + test( + function () { + assert_throws_dom("INDEX_SIZE_ERR", function () { + document.getElementById("assign-negative").maxLength = -5; + }); + }, "Assigning negative integer throws IndexSizeError"); + + test( + function () { + document.getElementById("assign-non-numeric").maxLength = "not-a-number"; + assert_equals(document.getElementById("assign-non-numeric").maxLength, 0); + }, "Assigning non-numeric to maxlength sets maxlength to 0"); + </script> +</body> + +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-minlength.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-minlength.html new file mode 100644 index 0000000000..2d40901b40 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-minlength.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html> + +<head> + <title>textarea minlength</title> + <link rel="author" title="tigercosmos" href="mailto:phy.tiger@gmail.com"> + <link rel=help href="https://html.spec.whatwg.org/multipage/#attr-textarea-minlength"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> + +<body> + + <textarea id="none"></textarea> + <textarea id="negative" minlength=-5></textarea> + <textarea id="non-numeric" minlength="not-a-number"></textarea> + <textarea id="assign-negative"></textarea> + <textarea id="assign-non-numeric"></textarea> + + <script> + test( + function () { + assert_equals(document.getElementById("none").minLength, -1); + }, "Unset minlength is -1"); + + test( + function () { + assert_equals(document.getElementById("negative").minLength, -1); + }, "Negative minlength is always -1"); + + test( + function () { + assert_equals(document.getElementById("non-numeric").minLength, -1); + }, "Non-numeric minlength is -1"); + + test( + function () { + assert_throws_dom("INDEX_SIZE_ERR", function () { + document.getElementById("assign-negative").minLength = -5; + }); + }, "Assigning negative integer throws IndexSizeError"); + + test( + function () { + document.getElementById("assign-non-numeric").minLength = "not-a-number"; + assert_equals(document.getElementById("assign-non-numeric").minLength, 0); + }, "Assigning non-numeric to minlength sets minlength to 0"); + </script> +</body> + +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-newline-bidi-ref.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-newline-bidi-ref.html new file mode 100644 index 0000000000..d69195b4f4 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-newline-bidi-ref.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> + <head> + <title>HTML Test reference: newline in <textarea> separates bidi paragraphs</title> + <link rel="author" title="Amir E. Aharoni" href="mailto:amir.aharoni@mail.huji.ac.il"/> + <link rel="author" title="Eyal Sela" href="mailto:eyal@post.isoc.org.il"/> + <link rel="author" title="Aharon Lanin" href="mailto:aharon@google.com"/> + <link rel="help" href="https://html.spec.whatwg.org/multipage/#the-textarea-element"/> + </head> + <body> + <div class="instructions"><p>Test passes if the rightmost character in the first line below is a full stop and to the left of it is a Hebrew letter.</p></div> + <div class="test"> + <textarea cols="70" rows="3"> +A Hebrew letter and a full stop: א.‎ +א this line begins with a Hebrew letter. + </textarea> + </div> + </body> +</html> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-newline-bidi.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-newline-bidi.html new file mode 100644 index 0000000000..ce1ff944c2 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-newline-bidi.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"/> + <title>HTML Test: newline in <textarea> separates bidi paragraphs</title> + <link rel="match" href="textarea-newline-bidi-ref.html" /> + <link rel="author" title="Amir E. Aharoni" href="mailto:amir.aharoni@mail.huji.ac.il"/> + <link rel="author" title="Eyal Sela" href="mailto:eyal@post.isoc.org.il"/> + <link rel="author" title="Aharon Lanin" href="mailto:aharon@google.com"/> + <link rel="help" href="https://html.spec.whatwg.org/multipage/#the-textarea-element"/> + <meta name="assert" + content="A newline in a textarea element, and in its raw value, should separate paragraphs for the purposes of the Unicode bidirectional algorithm."/> + </head> + <body> + <div class="instructions"><p>Test passes if the rightmost character in the first line below is a full stop and to the left of it is a Hebrew letter.</p></div> + <div class="test"> + <textarea cols="70" rows="3"> +A Hebrew letter and a full stop: א. +א this line begins with a Hebrew letter. + </textarea> + </div> + </body> +</html> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-placeholder-lineheight.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-placeholder-lineheight.html new file mode 100644 index 0000000000..e7df07c97a --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-placeholder-lineheight.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html> + +<head> + <title>textarea placeholder line-height</title> + <link rel="author" title="Daniel Libby" href="mailto:dlibby@microsoft.com"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <style> + textarea { + margin: 0; + border: 0; + padding: 0; + } + </style> +</head> + +<body> + <textarea rows=1 placeholder=foo style="border:0"></textarea> + <script> + let textarea = document.querySelector('textarea'); + const lineHeight = 19.5; + textarea.style.lineHeight = lineHeight + "px"; + test( + function () { + assert_equals(textarea.getBoundingClientRect().height, lineHeight); + }, "Bounding rect height for textarea must be the same as line-height"); + + test( + function () { + assert_equals(getComputedStyle(textarea).lineHeight, lineHeight + "px"); + }, "ComputedStyle line-height for textarea must be the same as set value"); + </script> +</body> + +</html> + diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-placeholder-manual.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-placeholder-manual.html new file mode 100644 index 0000000000..d59a259415 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-placeholder-manual.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>HTML Test: textarea - placeholder attribute</title> +<link rel="author" title="Intel" href="http://www.intel.com"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#attr-textarea-placeholder"> +<meta name="flags" content="interact"> +<body> + <p> + Test passes if there is a "Placeholder Text" in the text area, + and if the "Placeholder Text" disappears after type in any character. + </p> + <textarea placeholder="Placeholder Text"></textarea> +</body> + diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-select-event-manual.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-select-event-manual.html new file mode 100644 index 0000000000..f1679e2809 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-select-event-manual.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>HTMLTextAreaElement Test: select event</title> +<link rel="author" title="Intel" href="http://www.intel.com/"> +<meta name="flags" content="interact"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<p>Select any numberic characters in the text area below</p> + +<form id="testForm" name="testForm"> + <textarea id="testtextarea">0123456789</textarea> +</form> + +<script> + +var textarea = document.getElementById("testtextarea"); + +setup({explicit_done : true}); +setup({explicit_timeout : true}); + +on_event(textarea, "select", function(evt) { + test(function() { + assert_greater_than(textarea.value.substring(textarea.selectionStart, textarea.selectionEnd).length, 0, "Check if select event captured when text selected"); + }); + done(); +}); + +</script> + +<div id="log"></div> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-select-manual.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-select-manual.html new file mode 100644 index 0000000000..4e98ba5093 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-select-manual.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>HTMLTextAreaElement Test: select()</title> +<link rel="author" title="Intel" href="http://www.intel.com/"> +<meta name="flags" content="interact"> + +<p>Test passes if content of the input area is selected</p> + +<textarea id="test_obj">1234567</textarea> +<script> +var textarea = document.querySelector("#test_obj"); +textarea.select(); +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-setcustomvalidity.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-setcustomvalidity.html new file mode 100644 index 0000000000..922a1e73e6 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-setcustomvalidity.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<title>textarea setCustomValidity</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<textarea id='textarea_test'></textarea> + +<script> + +test(() => { + let elem = document.getElementById("textarea_test"); + assert_false(elem.validity.customError); + elem.setCustomValidity("custom error"); + assert_true(elem.validity.customError); +}, "textarea setCustomValidity is correct") + +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-splittext-with-range-crash.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-splittext-with-range-crash.html new file mode 100644 index 0000000000..9d66a4ae05 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-splittext-with-range-crash.html @@ -0,0 +1,24 @@ +<!doctype html> +<html> +<head> +<meta charset="utf-8"> +<script> +addEventListener("load", () => { + const textarea = document.querySelector("textarea"); + const ul = document.createElement('ul'); + + const textNodeInTextarea = document.createTextNode(""); + textarea.appendChild(textNodeInTextarea); + document.documentElement.getBoundingClientRect(); + + textarea.appendChild(ul); + const range = document.createRange(); + range.selectNode(ul); + + textNodeInTextarea.data = "ab"; + textNodeInTextarea.splitText(1); +}); +</script> +</head> +<body><textarea></textarea></body> +</html> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-splittext-with-range-simple-crash.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-splittext-with-range-simple-crash.html new file mode 100644 index 0000000000..d3c1e7ce94 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-splittext-with-range-simple-crash.html @@ -0,0 +1,14 @@ +<!doctype html> +<html> +<head> +<meta charset="utf-8"> +<script> +document.addEventListener("DOMContentLoaded", () => { + const textarea = document.querySelector("textarea"); + getSelection().selectAllChildren(textarea); + textarea.firstChild.splitText(0); +}); +</script> +</head> +<body><textarea>abcd</textarea></body> +</html> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-textLength.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-textLength.html new file mode 100644 index 0000000000..d249278960 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-textLength.html @@ -0,0 +1,19 @@ +<!DOCTYPE HTML> +<title>The textLengh IDL attribute</title> +<meta content="charset=utf-16"> +<link rel="author" title="tigercosmos" href="mailto:phy.tiger@gmail.com"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-textarea-textlength"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<textarea id="textarea"></textarea> +<script> + var textarea = document.getElementById("textarea"); + + test(function () { + textarea.value= "Hello, World!"; + assert_equals(textarea.textLength, 13); + + textarea.value = "\u4f60\u597d\uff0c\u4e16\u754c\uff01"; //你好,世界! + assert_equals(textarea.textLength, 6); + }, "Textarea's 'testLength' should work for utf-16."); +</script>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-type.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-type.html new file mode 100644 index 0000000000..ac80f93656 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-type.html @@ -0,0 +1,16 @@ +<!DOCTYPE HTML> +<title>The type IDL attribute</title> +<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-textarea-type"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="test"> +<textarea></textarea> +</div> +<script> +test(function() { + assert_equals(document.getElementById("test") + .getElementsByTagName("textarea")[0].type, + "textarea"); +}, "Textarea's type attribute should return 'textarea'"); +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-validity-clone.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-validity-clone.html new file mode 100644 index 0000000000..23d90e714b --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-validity-clone.html @@ -0,0 +1,27 @@ +<!doctype html> +<meta charset="utf-8"> +<title>HTML Test: <textarea> validity state is correct after a clone</title> +<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#the-textarea-element"> +<link rel="help" href="https://bugzil.la/1472169"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +test(function() { + let form = document.createElement("form"); + let textarea = document.createElement("textarea"); + textarea.required = true; + + textarea.appendChild(document.createTextNode("A")); + form.appendChild(textarea); + + assert_true(textarea.validity.valid); + + let formClone = form.cloneNode(true); + assert_equals( + formClone.querySelector('textarea').validity.valid, + textarea.validity.valid, + "Validity state should be preserved after a clone" + ); +}, "<textarea> validity state should be preserved after a clone"); +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-validity-valueMissing-inside-datalist.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-validity-valueMissing-inside-datalist.html new file mode 100644 index 0000000000..f0ce0028ee --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/textarea-validity-valueMissing-inside-datalist.html @@ -0,0 +1,19 @@ +<!doctype html> +<meta charset="utf-8"> +<title>textarea element with "required" attribute and empty value is considered "suffering from being missing" even if inside datalist element</title> +<link rel="help" href="https://html.spec.whatwg.org/multipage/form-elements.html#the-textarea-element:suffering-from-being-missing"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<datalist> + <textarea required></textarea> +</datalist> + +<script> +test(() => { + const textarea = document.querySelector("textarea"); + + assert_true(textarea.validity.valueMissing); + assert_false(textarea.validity.valid); +}); +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/value-defaultValue-textContent-xhtml.xhtml b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/value-defaultValue-textContent-xhtml.xhtml new file mode 100644 index 0000000000..9462e94935 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/value-defaultValue-textContent-xhtml.xhtml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>textarea element value/defaultValue/textContent functionality</title> +<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"/> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-textarea-value"/> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> +<script> +"use strict"; + +test(() => { + + const textarea = document.createElement("textarea"); + + textarea.appendChild(document.createCDATASection("foo bar baz")); + assert_equals(textarea.defaultValue, "foo bar baz", "the defaultValue should reflect the textContent"); + assert_equals(textarea.value, "foo bar baz", + "changing the child text content should change the raw value, and subsequently the api value"); + +}, "defaultValue and value include CDATASection Text nodes"); +</script> +</body> +</html> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html new file mode 100644 index 0000000000..a1a405fdbe --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html @@ -0,0 +1,181 @@ +<!DOCTYPE HTML> +<title>textarea element value/defaultValue/textContent functionality</title> +<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-textarea-value"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<script> +"use strict"; + +test(() => { + + const textarea = document.createElement("textarea"); + + assert_equals(textarea.defaultValue, "", "defaultValue is empty string when it has no content"); + assert_equals(textarea.value, "", "value is empty string when it has no content"); + +}, "defaultValue and value are the empty string by default"); + +test(() => { + + const textarea = document.createElement("textarea"); + + textarea.textContent = "foo bar"; + assert_equals(textarea.defaultValue, "foo bar", "the defaultValue should reflect the textContent"); + assert_equals(textarea.value, "foo bar", + "changing the textContent should change the raw value, and subsequently the api value"); + +}, "defaultValue and value are affected by setting textContent"); + +test(() => { + + const textarea = document.createElement("textarea"); + + textarea.textContent = "some text"; + textarea.firstChild.nodeValue = "foo bar"; + assert_equals(textarea.defaultValue, "foo bar", "the defaultValue should reflect the textContent"); + assert_equals(textarea.value, "foo bar", + "changing the textContent should change the raw value, and subsequently the api value"); + +}, "defaultValue and value are affected by setting nodeValue on a child text node"); + +test(() => { + + const textarea = document.createElement("textarea"); + + textarea.textContent = "some text"; + textarea.firstChild.data = "foo bar"; + assert_equals(textarea.defaultValue, "foo bar", "the defaultValue should reflect the textContent"); + assert_equals(textarea.value, "foo bar", + "changing the textContent should change the raw value, and subsequently the api value"); + +}, "defaultValue and value are affected by setting data on a child text node"); + +test(() => { + + const textarea = document.createElement("textarea"); + + textarea.textContent = "foo bar"; + textarea.appendChild(document.createTextNode(" baz")); + assert_equals(textarea.defaultValue, "foo bar baz", "the defaultValue should reflect the textContent"); + assert_equals(textarea.value, "foo bar baz", + "changing the textContent should change the raw value, and subsequently the api value"); + +}, "defaultValue and value are affected by textContent in combination with appending a text node"); + +test(() => { + + const textarea = document.createElement("textarea"); + textarea.textContent = "foo bar"; + + const frag = document.createDocumentFragment(); + frag.appendChild(document.createTextNode(" baz")); + const el = document.createElement("span"); + el.appendChild(document.createTextNode("qux?")); + frag.appendChild(el); + frag.appendChild(document.createTextNode(" fizz")); + textarea.appendChild(frag); + + textarea.appendChild(document.createTextNode(" whee")); + assert_equals(textarea.defaultValue, "foo bar baz fizz whee", "the defaultValue should reflect the textContent"); + assert_equals(textarea.value, "foo bar baz fizz whee", + "changing the textContent should change the raw value, and subsequently the api value"); + +}, "defaultValue and value are affected by textContent in combination with appending a DocumentFragment"); + +test(() => { + + const textarea = document.createElement("textarea"); + textarea.appendChild(document.createTextNode("foo bar")); + + const child = document.createElement("span"); + child.textContent = "baz"; + textarea.appendChild(child); + + assert_equals(textarea.textContent, "foo barbaz", "the textContent should have *all* the text content"); + assert_equals(textarea.defaultValue, "foo bar", "the defaultValue should reflect the child text content"); + assert_equals(textarea.value, "foo bar", + "changing the child text content should change the raw value, and subsequently the api value"); + +}, "defaultValue and value reflect child text content, not textContent"); + +test(() => { + + const textarea = document.createElement("textarea"); + textarea.appendChild(document.createTextNode("foo bar")); + + const child = document.createElement("span"); + child.textContent = "baz"; + textarea.appendChild(child); + + textarea.defaultValue = "foo"; + + assert_equals(textarea.childNodes.length, 1, "Only one child node should exist"); + assert_equals(textarea.defaultValue, "foo", "the defaultValue should be the new text"); + assert_equals(textarea.value, "foo", "the api value should be the new text"); + assert_equals(textarea.textContent, "foo", "the textContent should be the new text"); + +}, "Setting defaultValue wipes out any children, including elements (just like setting textContent)"); + +test(() => { + + const textarea = document.createElement("textarea"); + + textarea.textContent = "foo\r\nbar\rbaz\nqux"; + assert_equals(textarea.defaultValue, "foo\r\nbar\rbaz\nqux", "the defaultValue should reflect the textContent"); + assert_equals(textarea.value, "foo\nbar\nbaz\nqux", "The value property should normalize CRLF and CR to LF"); + +}, "defaultValue and value treat CRLF differently"); + +test(() => { + + const textarea = document.createElement("textarea"); + + textarea.appendChild(document.createTextNode("foo\r")); + textarea.appendChild(document.createTextNode("\nbar\rbaz\nqux")); + assert_equals(textarea.defaultValue, "foo\r\nbar\rbaz\nqux", "the defaultValue should reflect the textContent"); + assert_equals(textarea.value, "foo\nbar\nbaz\nqux", "The value property should normalize CRLF and CR to LF"); + +}, "value normalizes CRLF even spread over multiple text nodes"); + +test(() => { + + const textarea = document.createElement("textarea"); + + textarea.textContent = "foo"; + textarea.value = "baz"; + assert_equals(textarea.defaultValue, "foo", "setting the value property should not affect the defaultValue"); + assert_equals(textarea.textContent, "foo", "setting the value property should not affect the textContent"); + assert_equals(textarea.value, "baz", + "on setting, the value property must set the element's raw & api value to the new value"); + + textarea.value = "foo\r\nbar\rbaz\nqux"; + assert_equals(textarea.value, "foo\nbar\nbaz\nqux", "The API value should normalize CRLF and CR to LF"); + + textarea.value = null; + assert_equals(textarea.value, "", "setting the value property to null should result in an empty string"); + +}, "tests for the value setter"); + +test(() => { + + const textarea = document.createElement("textarea"); + + textarea.defaultValue = "foo\0"; + assert_equals(textarea.defaultValue, "foo\0", "defaultValue after setting defaultValue"); + assert_equals(textarea.textContent, "foo\0", "textContent after setting defaultValue"); + assert_equals(textarea.value, "foo\0", "value after setting defaultValue"); + + textarea.textContent = "bar\0"; + assert_equals(textarea.defaultValue, "bar\0", "defaultValue after setting textContent"); + assert_equals(textarea.textContent, "bar\0", "textContent after setting textContent"); + assert_equals(textarea.value, "bar\0", "value after setting textContent"); + + textarea.value = "baz\0"; + assert_equals(textarea.defaultValue, "bar\0", "defaultValue after setting value"); + assert_equals(textarea.textContent, "bar\0", "textContent after setting value"); + assert_equals(textarea.value, "baz\0", "value after setting value"); + +}, "tests for U+0000 NULL"); +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrap-enumerated-ascii-case-insensitive-child.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrap-enumerated-ascii-case-insensitive-child.html new file mode 100644 index 0000000000..92c9981a11 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrap-enumerated-ascii-case-insensitive-child.html @@ -0,0 +1,5 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<script> +parent.postMessage(location.href, "*"); +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrap-enumerated-ascii-case-insensitive.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrap-enumerated-ascii-case-insensitive.html new file mode 100644 index 0000000000..9bb16bb681 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrap-enumerated-ascii-case-insensitive.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<link rel="help" href="https://html.spec.whatwg.org/#attr-textarea-wrap"> +<link rel="help" href="https://html.spec.whatwg.org/#enumerated-attribute"> +<meta name="assert" content="textarea@wrap values are ASCII case-insensitive"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<form target="child" method="GET" action="wrap-enumerated-ascii-case-insensitive-child.html"> + <textarea name="a" wrap="hard" cols="7">hello world</textarea> + <textarea name="b" wrap="HaRd" cols="7">hello world</textarea> + <textarea name="c" wrap="soft" cols="7">hello world</textarea> + <textarea name="d" wrap="SoFt" cols="7">hello world</textarea> + <textarea name="e" wrap="ſoft" cols="7">hello world</textarea> +</form> +<iframe name="child"></iframe> +<script> +// #dom-textarea-wrap reflects the content attribute, but it isn’t a nullable +// DOMString, nor is it #limited-to-only-known-values, so we can’t just take +// the shortcut of asserting the IDL attribute like most other attributes +async_test(function() { + // we use a message rather than the iframe’s load event to avoid dealing with + // spurious load events that some browsers dispatch on the initial about:blank + addEventListener("message", this.step_func_done(event => { + const params = new URL(event.data).searchParams; + + // #textarea-wrapping-transformation says that a UA-defined algorithm wraps + // values by inserting CRLF pairs, so "hello \r\nworld" and "hello w\r\norld" + // are two of many valid outcomes for cols=7 + assert_true(params.get("a").includes("\r\n"), "lowercase “hard” valid"); + assert_true(params.get("b").includes("\r\n"), "mixed case “hard” valid"); + assert_false(params.get("c").includes("\r\n"), "lowercase “soft” valid"); + + // vacuous: the invalid value default is currently soft, so even if the UA + // treats this as invalid, the observable behaviour would still be correct + assert_false(params.get("d").includes("\r\n"), "mixed case “soft” valid"); + + // vacuous: the invalid value default is currently soft, so even if the UA + // treats this as valid, the observable behaviour would still be correct + assert_false(params.get("e").includes("\r\n"), "non-ASCII “soft” invalid"); + })); + + // we submit the form in GET mode to observe the values [#concept-fe-value] of + // the textareas, because IDL gives us the API value [#concept-fe-api-value], + // which isn’t subject to hard wrapping [#textarea-wrapping-transformation] + document.querySelector("form").submit(); +}, "keywords"); +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrap-reflect-1-ref.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrap-reflect-1-ref.html new file mode 100644 index 0000000000..98a7f8a3af --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrap-reflect-1-ref.html @@ -0,0 +1,5 @@ +<!DOCTYPE html> +<title>Dynamic manipulation of textarea.wrap</title> +<link rel=help href=https://html.spec.whatwg.org/multipage/#dom-textarea-wrap> +<link rel=author title=Ms2ger href=mailto:ms2ger@gmail.com> +<textarea wrap=soft cols=20>01234567890 01234567890 01234567890</textarea> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrap-reflect-1a.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrap-reflect-1a.html new file mode 100644 index 0000000000..b3baa79d7a --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrap-reflect-1a.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<title>Dynamic manipulation of textarea.wrap</title> +<link rel=match href=wrap-reflect-1-ref.html> +<link rel=help href=https://html.spec.whatwg.org/multipage/#dom-textarea-wrap> +<link rel=author title=Ms2ger href=mailto:ms2ger@gmail.com> +<textarea wrap=off cols=20>01234567890 01234567890 01234567890</textarea> +<script> +document.getElementsByTagName("textarea")[0].wrap = "soft"; +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrap-reflect-1b.html b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrap-reflect-1b.html new file mode 100644 index 0000000000..b0a9b460f0 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrap-reflect-1b.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<title>Dynamic manipulation of textarea.wrap</title> +<link rel=match href=wrap-reflect-1-ref.html> +<link rel=help href=https://html.spec.whatwg.org/multipage/#dom-textarea-wrap> +<link rel=author title=Ms2ger href=mailto:ms2ger@gmail.com> +<textarea wrap=off cols=20>01234567890 01234567890 01234567890</textarea> +<script> +document.getElementsByTagName("textarea")[0].setAttribute("wrap", "soft"); +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrapping-transformation.window.js b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrapping-transformation.window.js new file mode 100644 index 0000000000..c5c28a4854 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/the-textarea-element/wrapping-transformation.window.js @@ -0,0 +1,58 @@ +test((t) => { + const form = document.createElement("form"); + const textarea = document.createElement("textarea"); + textarea.name = "linebreakTest"; + textarea.textContent = "a\nb\rc\r\nd\n\re"; + form.appendChild(textarea); + document.body.appendChild(form); + t.add_cleanup(() => { + document.body.removeChild(form); + }); + + assert_equals(textarea.textContent, "a\nb\rc\r\nd\n\re"); + assert_equals(textarea.value, "a\nb\nc\nd\n\ne"); + + const formData = new FormData(form); + assert_equals( + formData.get("linebreakTest"), + "a\nb\nc\nd\n\ne", + ); +}, "Textarea wrapping transformation: Newlines should be normalized to LF."); + +test((t) => { + const form = document.createElement("form"); + const textarea = document.createElement("textarea"); + textarea.name = "wrapTest"; + textarea.cols = 10; + textarea.wrap = "hard"; + textarea.textContent = + "Some text that is too long for the specified character width."; + form.appendChild(textarea); + document.body.appendChild(form); + t.add_cleanup(() => { + document.body.removeChild(form); + }); + + assert_true( + !textarea.textContent.includes("\n") && + !textarea.textContent.includes("\r"), + "textContent shouldn't contain any newlines", + ); + assert_true( + !textarea.textContent.includes("\n") && + !textarea.textContent.includes("\r"), + "The API value shouldn't be line wrapped.", + ); + + const formData = new FormData(form); + const formDataValue = formData.get("wrapTest"); + + assert_true( + !formDataValue.includes("\r"), + "The wrapping done on the value must be LF, not CRLF.", + ); + assert_true( + formDataValue.includes("\n"), + "The value must be wrapped.", + ); +}, "Textarea wrapping transformation: Wrapping happens with LF newlines."); |