aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/metadata/MANIFEST.json48
-rw-r--r--tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini4
-rw-r--r--tests/wpt/metadata/css/cssom-view/getClientRects-inline-inline-child.html.ini4
-rw-r--r--tests/wpt/metadata/fetch/content-type/response.window.js.ini13
-rw-r--r--tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini2
-rw-r--r--tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini7
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini (renamed from tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini)2
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini4
-rw-r--r--tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/skip-document-with-fragment.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini3
-rw-r--r--tests/wpt/metadata/performance-timeline/webtiming-resolution.any.js.ini3
-rw-r--r--tests/wpt/metadata/resource-timing/crossorigin-sandwich-TAO.sub.html.ini1
-rw-r--r--tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini1
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/change-intrinsic-width.html14
-rw-r--r--tests/wpt/web-platform-tests/css/cssom-view/getClientRects-inline-inline-child.html52
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html20
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html76
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/constraints/support/validator.js111
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js9
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py5
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/test-wait.js3
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py21
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py1
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan.https.html23
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html14
26 files changed, 303 insertions, 148 deletions
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index 0609c7b29a9..0942f7eec75 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -134637,6 +134637,18 @@
{}
]
],
+ "css/css-multicol/change-intrinsic-width.html": [
+ [
+ "css/css-multicol/change-intrinsic-width.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-multicol/column-count-used-001.html": [
[
"css/css-multicol/column-count-used-001.html",
@@ -338168,6 +338180,12 @@
{}
]
],
+ "css/cssom-view/getClientRects-inline-inline-child.html": [
+ [
+ "css/cssom-view/getClientRects-inline-inline-child.html",
+ {}
+ ]
+ ],
"css/cssom-view/historical.html": [
[
"css/cssom-view/historical.html",
@@ -588279,6 +588297,10 @@
"434dc52ea3d731bd1393270372294cd007382e59",
"testharness"
],
+ "css/css-multicol/change-intrinsic-width.html": [
+ "3df3e1ebc8f9b5780dc858a878bca13dbedcdb35",
+ "reftest"
+ ],
"css/css-multicol/column-count-used-001.html": [
"2949a1996ebae0c48329906ea7ef34c83080e90f",
"reftest"
@@ -625603,6 +625625,10 @@
"f1f6fc5abc679d087d221573456eb9219d1a405c",
"testharness"
],
+ "css/cssom-view/getClientRects-inline-inline-child.html": [
+ "9a03ccdbccc80d8a0ce6f701aeaa802b1b4715e4",
+ "testharness"
+ ],
"css/cssom-view/getClientRects-inline.html": [
"415e34a6f0430e08441ee32b3f7c0ca8cd11a692",
"reftest"
@@ -664512,11 +664538,11 @@
"testharness"
],
"html/semantics/forms/constraints/form-validation-validity-valid.html": [
- "cec5dcbf0d5cfb340e100a82e723e1d620d16399",
+ "03655ffd2f5ba24b30e6864c8393ecbf36230aef",
"testharness"
],
"html/semantics/forms/constraints/form-validation-validity-valueMissing.html": [
- "3c9e4c4cb096bbe93b540c3f704d0d116a055aba",
+ "2e1c666436a19bc759026ebf55df4a17073ecb5d",
"testharness"
],
"html/semantics/forms/constraints/form-validation-willValidate.html": [
@@ -664532,7 +664558,7 @@
"testharness"
],
"html/semantics/forms/constraints/support/validator.js": [
- "48c3a5b40e6bbe06b18dde7f473188a827b7de6a",
+ "33508fb3289be3736f6f467957dc6614bec2bc9b",
"support"
],
"html/semantics/forms/constraints/tooLong-input-email-delete-manual.html": [
@@ -701572,7 +701598,7 @@
"support"
],
"resources/chromium/nfc-mock.js": [
- "4bafc9b0ad8f7f8ad4185914fffef16949695ab3",
+ "2c1724b7592eb1d6e66177544998abbec70fbfe6",
"support"
],
"resources/chromium/sensor.mojom.js": [
@@ -717860,7 +717886,7 @@
"support"
],
"tools/wptrunner/wptrunner/browsers/firefox_android.py": [
- "33b5d51e54e82adb6cdbe4612263bc30883dd108",
+ "fee528071f68843ab056f513295146685f8f78f4",
"support"
],
"tools/wptrunner/wptrunner/browsers/ie.py": [
@@ -717936,7 +717962,7 @@
"support"
],
"tools/wptrunner/wptrunner/executors/executormarionette.py": [
- "59f7e865a5b8711fa71c9c8955eca731e0048c3f",
+ "01306397db7944cd0dfadf8f1bf0327dbacf94d6",
"support"
],
"tools/wptrunner/wptrunner/executors/executoropera.py": [
@@ -717992,7 +718018,7 @@
"support"
],
"tools/wptrunner/wptrunner/executors/test-wait.js": [
- "8a7edb79d62256eef63c71eabd450d42bce7c4d2",
+ "ad08ad7d76fb0299aadedb572193c38c5055e654",
"support"
],
"tools/wptrunner/wptrunner/executors/testharness_servodriver.js": [
@@ -718012,7 +718038,7 @@
"support"
],
"tools/wptrunner/wptrunner/font.py": [
- "6647a8580be7ab4050bbd37593b2e6595bc3ac72",
+ "daf0a1c1bfa221aa47981d93239021e4aefa74a9",
"support"
],
"tools/wptrunner/wptrunner/formatters/__init__.py": [
@@ -718244,7 +718270,7 @@
"support"
],
"tools/wptrunner/wptrunner/wptrunner.py": [
- "7409dc26560af0be3a397bb73184137d8715811f",
+ "75ce104c7cee335afa2e86592caa2c4caa473bcf",
"support"
],
"tools/wptrunner/wptrunner/wpttest.py": [
@@ -724608,7 +724634,7 @@
"manual"
],
"web-nfc/NDEFReader_scan.https.html": [
- "a9b1d7516173418243c630817eea22fd0bed2046",
+ "17b9fdb8569db230c3a3ded22e0258e4f73a69fc",
"testharness"
],
"web-nfc/NDEFReader_scan_filter.https.html": [
@@ -724632,7 +724658,7 @@
"manual"
],
"web-nfc/NDEFWriter_push.https.html": [
- "4ff0af8fb0b3947595bdf48015ebabce165003ba",
+ "cb6b3941410035c5c5736e13d59fbbfb85f0d4cc",
"testharness"
],
"web-nfc/README.md": [
diff --git a/tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini b/tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini
new file mode 100644
index 00000000000..e38782d8c85
--- /dev/null
+++ b/tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini
@@ -0,0 +1,4 @@
+[elementFromPoint-001.html]
+ [CSSOM View - 5 - extensions to the Document interface]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/cssom-view/getClientRects-inline-inline-child.html.ini b/tests/wpt/metadata/css/cssom-view/getClientRects-inline-inline-child.html.ini
new file mode 100644
index 00000000000..8ff7d008595
--- /dev/null
+++ b/tests/wpt/metadata/css/cssom-view/getClientRects-inline-inline-child.html.ini
@@ -0,0 +1,4 @@
+[getClientRects-inline-inline-child.html]
+ [sub element in a child inline box should not be included]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/content-type/response.window.js.ini b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
index 9fdb1aa8bf6..52662ab4ad3 100644
--- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
@@ -309,9 +309,6 @@
[<iframe>: separate response Content-Type: */* text/html]
expected: FAIL
- [<iframe>: separate response Content-Type: text/html;" text/plain]
- expected: FAIL
-
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
expected: FAIL
@@ -324,15 +321,15 @@
[<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
expected: FAIL
- [<iframe>: combined response Content-Type: text/html */*]
- expected: FAIL
-
[fetch(): separate response Content-Type: text/plain ]
expected: NOTRUN
- [<iframe>: combined response Content-Type: text/html;" \\" text/plain]
+ [<iframe>: combined response Content-Type: */* text/html]
+ expected: FAIL
+
+ [<iframe>: separate response Content-Type: text/html */*]
expected: FAIL
- [<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
+ [<iframe>: separate response Content-Type: text/html;" \\" text/plain]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
index d4ba399b762..536384f36e1 100644
--- a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
+++ b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
@@ -11,6 +11,6 @@
[X-Content-Type-Options%3A%20nosniff%0C]
expected: FAIL
- [X-Content-Type-Options%3A%20'NosniFF']
+ [X-Content-Type-Options%3A%20%2Cnosniff]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini b/tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini
index 54f7f890b05..0cb858e8b2e 100644
--- a/tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini
+++ b/tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini
@@ -8,8 +8,11 @@
expected: FAIL
[Embedded credentials are treated as network errors in new windows.]
- expected: TIMEOUT
+ expected: FAIL
[Embedded credentials matching the top-level are treated as network errors for cross-origin URLs.]
- expected: FAIL
+ expected: TIMEOUT
+
+ [Embedded credentials matching the top-level are not treated as network errors for relative URLs.]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini
index 75d75b4cda2..51f8272a6de 100644
--- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini
+++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini
@@ -1,4 +1,4 @@
-[traverse_the_history_2.html]
+[traverse_the_history_3.html]
[Multiple history traversals, last would be aborted]
expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini
new file mode 100644
index 00000000000..16fa2c5cfc1
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini
@@ -0,0 +1,4 @@
+[creating_browsing_context_test_01.html]
+ [first argument: absolute url]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/skip-document-with-fragment.html.ini b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/skip-document-with-fragment.html.ini
index 6852d7663de..c12c0f8ae48 100644
--- a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/skip-document-with-fragment.html.ini
+++ b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/skip-document-with-fragment.html.ini
@@ -1,8 +1,4 @@
[skip-document-with-fragment.html]
- expected: TIMEOUT
[Autofocus elements in iframed documents with URL fragments should be skipped.]
expected: FAIL
- [Autofocus elements in top-level browsing context's documents with URI fragments should be skipped.]
- expected: TIMEOUT
-
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
index 5f60c78e73c..f6a7aca3306 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
@@ -1,6 +1,5 @@
[iframe_sandbox_popups_escaping-3.html]
type: testharness
- expected: TIMEOUT
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/performance-timeline/webtiming-resolution.any.js.ini b/tests/wpt/metadata/performance-timeline/webtiming-resolution.any.js.ini
index 97f8a0cc51f..6d08beab111 100644
--- a/tests/wpt/metadata/performance-timeline/webtiming-resolution.any.js.ini
+++ b/tests/wpt/metadata/performance-timeline/webtiming-resolution.any.js.ini
@@ -10,6 +10,3 @@
[Verifies the resolution of entry.startTime is at least 20 microseconds.]
expected: TIMEOUT
- [Verifies the resolution of performance.now() is at least 5 microseconds.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/resource-timing/crossorigin-sandwich-TAO.sub.html.ini b/tests/wpt/metadata/resource-timing/crossorigin-sandwich-TAO.sub.html.ini
index b4090ef9fe2..1c7ec9ce1db 100644
--- a/tests/wpt/metadata/resource-timing/crossorigin-sandwich-TAO.sub.html.ini
+++ b/tests/wpt/metadata/resource-timing/crossorigin-sandwich-TAO.sub.html.ini
@@ -1,5 +1,4 @@
[crossorigin-sandwich-TAO.sub.html]
- expected: ERROR
[There should be one entry.]
expected: FAIL
diff --git a/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini b/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini
index f584fce5df1..268949ced5c 100644
--- a/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini
+++ b/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini
@@ -1,5 +1,4 @@
[005.html]
- expected: ERROR
[dedicated worker in shared worker in dedicated worker]
expected: FAIL
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/change-intrinsic-width.html b/tests/wpt/web-platform-tests/css/css-multicol/change-intrinsic-width.html
new file mode 100644
index 00000000000..3df3e1ebc8f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/change-intrinsic-width.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#pseudo-algorithm">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1037790">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="columns:2; column-fill:auto; column-gap:0; width:fit-content; height:100px; background:red;">
+ <div id="firstChild" style="width:200px; height:100px; background:green;"></div>
+ <div style="width:50px; height:100px; background:green;"></div>
+</div>
+<script>
+ document.body.offsetTop;
+ firstChild.style.width = "50px";
+</script>
diff --git a/tests/wpt/web-platform-tests/css/cssom-view/getClientRects-inline-inline-child.html b/tests/wpt/web-platform-tests/css/cssom-view/getClientRects-inline-inline-child.html
new file mode 100644
index 00000000000..9a03ccdbccc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/cssom-view/getClientRects-inline-inline-child.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/cssom-view-1/#dom-element-getclientrects">
+<link rel="author" title="Koji Ishii" href="mailto:kojii@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+ <div>
+ <span>test</span>
+ <span id="vertical-align-sub-as-grand-child"
+ title="sub element in a child inline box should not be included">
+ <span>
+ <sub class="not-include" style="vertical-align: sub">subscript</sub>
+ </span>
+ </span>
+ <span>test</span>
+ </div>
+<script>
+testTargetDoesNotInclude('vertical-align-sub-as-grand-child');
+
+function testTargetDoesNotInclude(target) {
+ target = document.getElementById(target);
+ test(() => {
+ let target_rects = target.getClientRects();
+
+ let not_include_rects = [];
+ for (let element of target.querySelectorAll('.not-include')) {
+ for (let rect of element.getClientRects())
+ not_include_rects.push(rect);
+ }
+ for (let rect of target_rects) {
+ for (let not_include_rect of not_include_rects) {
+ assert_rect_not_equals(rect, not_include_rect);
+ }
+ }
+ }, target.title);
+}
+
+function assert_rect_not_equals(rect1, rect2) {
+ assert_false(rectEquals(rect1, rect2),
+ `${rectToString(rect1)} and ${rectToString(rect2)} are not equal`);
+}
+
+function rectEquals(rect1, rect2) {
+ return rect1.x === rect2.x && rect1.y === rect2.y &&
+ rect1.width === rect2.width && rect1.height === rect2.height;
+}
+
+function rectToString(rect) {
+ return `{${rect.x}, ${rect.y} ${rect.width}x${rect.height}}`;
+}
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html
index cec5dcbf0d5..03655ffd2f5 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html
@@ -15,7 +15,7 @@
types: ["text", "search", "tel", "password"],
testData: [
{conditions: {pattern: "[A-Z]", value: "abc"}, expected: false, name: "[target] validity.valid must be false if validity.patternMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -24,7 +24,7 @@
testData: [
{conditions: {pattern: "http://www.example.com", value: "http://www.example.net"}, expected: false, name: "[target] validity.valid must be false if validity.patternMismatch is true"},
{conditions: {value: "abc"}, expected: false, name: "[target] validity.valid must be false if validity.typeMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -33,7 +33,7 @@
testData: [
{conditions: {pattern: "test@example.com", value: "test@example.net"}, expected: false, name: "[target] validity.valid must be false if validity.patternMismatch is true"},
{conditions: {value: "abc"}, expected: false, name: "[target] validity.valid must be false if validity.typeMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -43,7 +43,7 @@
{conditions: {max: "2000-01-01T12:00:00", value: "2001-01-01T12:00:00"}, expected: false, name: "[target] validity.valid must be false if validity.rangeOverflow is true"},
{conditions: {min: "2001-01-01T12:00:00", value: "2000-01-01T12:00:00"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"},
{conditions: {step: 2 * 60 * 1000, value: "2001-01-01T12:03:00"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -53,7 +53,7 @@
{conditions: {max: "2000-01-01", value: "2001-01-01"}, expected: false, name: "[target] validity.valid must be false if validity.rangeOverflow is true"},
{conditions: {min: "2001-01-01", value: "2000-01-01"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"},
{conditions: {step: 2 * 1 * 86400000, value: "2000-01-03"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -64,7 +64,7 @@
{conditions: {min: "2001-01", value: "2000-01"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"},
// Step checks that "months since Jan 1970" is evenly divisible by `step`
{conditions: {step: 3, value: "2001-02"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -74,7 +74,7 @@
{conditions: {max: "2000-W01", value: "2001-W01"}, expected: false, name: "[target] validity.valid must be false if validity.rangeOverflow is true"},
{conditions: {min: "2001-W01", value: "2000-W01"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"},
{conditions: {step: 2 * 1 * 604800000, value: "2001-W03"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -84,7 +84,7 @@
{conditions: {max: "12:00:00", value: "13:00:00"}, expected: false, name: "[target] validity.valid must be false if validity.rangeOverflow is true"},
{conditions: {min: "12:00:00", value: "11:00:00"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"},
{conditions: {step: 2 * 60 * 1000, value: "12:03:00"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -94,7 +94,7 @@
{conditions: {max: "5", value: "6"}, expected: false, name: "[target] validity.valid must be false if validity.rangeOverflow is true"},
{conditions: {min: "5", value: "4"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"},
{conditions: {step: 2 * 1 * 1, value: "3"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -122,7 +122,7 @@
tag: "textarea",
types: [],
testData: [
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
}
];
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html
index 3c9e4c4cb09..2e1c666436a 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html
@@ -16,7 +16,7 @@
testData: [
{conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"},
{conditions: {required: true, value: "abc"}, expected: false, name: "[target] The value is not empty and required is true"},
- {conditions: {required: true, value: ""}, expected: true, name: "[target] The value is empty and required is true"}
+ {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value is empty and required is true"}
]
},
{
@@ -27,13 +27,13 @@
{conditions: {required: true, value: "2000-12-10T12:00:00"}, expected: false, name: "[target] Valid local date and time string(2000-12-10T12:00:00)"},
{conditions: {required: true, value: "2000-12-10 12:00"}, expected: false, name: "[target] Valid local date and time string(2000-12-10 12:00)"},
{conditions: {required: true, value: "1979-10-14T12:00:00.001"}, expected: false, name: "[target] Valid local date and time string(1979-10-14T12:00:00.001)"},
- {conditions: {required: true, value: 1234567}, expected: true, name: "[target] The value attribute is a number(1234567)"},
- {conditions: {required: true, value: new Date()}, expected: true, name: "[target] The value attribute is a Date object"},
- {conditions: {required: true, value: "1979-10-99 99:99"}, expected: true, name: "[target] Invalid local date and time string(1979-10-99 99:99)"},
+ {conditions: {required: true, value: 1234567}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a number(1234567)"},
+ {conditions: {required: true, value: new Date()}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a Date object"},
+ {conditions: {required: true, value: "1979-10-99 99:99"}, expected: true, expectedImmutable: false, name: "[target] Invalid local date and time string(1979-10-99 99:99)"},
{conditions: {required: true, value: "1979-10-14 12:00:00"}, expected: false, name: "[target] Valid local date and time string(1979-10-14 12:00:00)"},
- {conditions: {required: true, value: "2001-12-21 12:00"}, expected: true, name: "[target] Invalid local date and time string(2001-12-21 12:00)-two white space"},
- {conditions: {required: true, value: "abc"}, expected: true, name: "[target] the value attribute is a string(abc)"},
- {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"}
+ {conditions: {required: true, value: "2001-12-21 12:00"}, expected: true, expectedImmutable: false, name: "[target] Invalid local date and time string(2001-12-21 12:00)-two white space"},
+ {conditions: {required: true, value: "abc"}, expected: true, expectedImmutable: false, name: "[target] the value attribute is a string(abc)"},
+ {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"}
]
},
{
@@ -43,12 +43,12 @@
{conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"},
{conditions: {required: true, value: "2000-12-10"}, expected: false, name: "[target] Valid date string(2000-12-10)"},
{conditions: {required: true, value: "9999-01-01"}, expected: false, name: "[target] Valid date string(9999-01-01)"},
- {conditions: {required: true, value: 1234567}, expected: true, name: "[target] The value attribute is a number(1234567)"},
- {conditions: {required: true, value: new Date()}, expected: true, name: "[target] The value attribute is a Date object"},
- {conditions: {required: true, value: "9999-99-99"}, expected: true, name: "[target] Invalid date string(9999-99-99)"},
- {conditions: {required: true, value: "37/01/01"}, expected: true, name: "[target] Invalid date string(37-01-01)"},
- {conditions: {required: true, value: "2000/01/01"}, expected: true, name: "[target] Invalid date string(2000/01/01)"},
- {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"}
+ {conditions: {required: true, value: 1234567}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a number(1234567)"},
+ {conditions: {required: true, value: new Date()}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a Date object"},
+ {conditions: {required: true, value: "9999-99-99"}, expected: true, expectedImmutable: false, name: "[target] Invalid date string(9999-99-99)"},
+ {conditions: {required: true, value: "37/01/01"}, expected: true, expectedImmutable: false, name: "[target] Invalid date string(37-01-01)"},
+ {conditions: {required: true, value: "2000/01/01"}, expected: true, expectedImmutable: false, name: "[target] Invalid date string(2000/01/01)"},
+ {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"}
]
},
{
@@ -58,12 +58,12 @@
{conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"},
{conditions: {required: true, value: "2000-12"}, expected: false, name: "[target] Valid month string(2000-12)"},
{conditions: {required: true, value: "9999-01"}, expected: false, name: "[target] Valid month string(9999-01)"},
- {conditions: {required: true, value: 1234567}, expected: true, name: "[target] The value attribute is a number(1234567)"},
- {conditions: {required: true, value: new Date()}, expected: true, name: "[target] The value attribute is a Date object"},
- {conditions: {required: true, value: "2000-99"}, expected: true, name: "[target] Invalid month string(2000-99)"},
- {conditions: {required: true, value: "37-01"}, expected: true, name: "[target] Invalid month string(37-01)"},
- {conditions: {required: true, value: "2000/01"}, expected: true, name: "[target] Invalid month string(2000/01)"},
- {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"}
+ {conditions: {required: true, value: 1234567}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a number(1234567)"},
+ {conditions: {required: true, value: new Date()}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a Date object"},
+ {conditions: {required: true, value: "2000-99"}, expected: true, expectedImmutable: false, name: "[target] Invalid month string(2000-99)"},
+ {conditions: {required: true, value: "37-01"}, expected: true, expectedImmutable: false, name: "[target] Invalid month string(37-01)"},
+ {conditions: {required: true, value: "2000/01"}, expected: true, expectedImmutable: false, name: "[target] Invalid month string(2000/01)"},
+ {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"}
]
},
{
@@ -73,12 +73,12 @@
{conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"},
{conditions: {required: true, value: "2000-W12"}, expected: false, name: "[target] Valid week string(2000-W12)"},
{conditions: {required: true, value: "9999-W01"}, expected: false, name: "[target] Valid week string(9999-W01)"},
- {conditions: {required: true, value: 1234567}, expected: true, name: "[target] The value attribute is a number(1234567)"},
- {conditions: {required: true, value: new Date()}, expected: true, name: "[target] The value attribute is a Date object"},
- {conditions: {required: true, value: "2000-W99"}, expected: true, name: "[target] Invalid week string(2000-W99)"},
- {conditions: {required: true, value: "2000-W00"}, expected: true, name: "[target] invalid week string(2000-W00)"},
- {conditions: {required: true, value: "2000-w01"}, expected: true, name: "[target] invalid week string(2000-w01)"},
- {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"}
+ {conditions: {required: true, value: 1234567}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a number(1234567)"},
+ {conditions: {required: true, value: new Date()}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a Date object"},
+ {conditions: {required: true, value: "2000-W99"}, expected: true, expectedImmutable: false, name: "[target] Invalid week string(2000-W99)"},
+ {conditions: {required: true, value: "2000-W00"}, expected: true, expectedImmutable: false, name: "[target] invalid week string(2000-W00)"},
+ {conditions: {required: true, value: "2000-w01"}, expected: true, expectedImmutable: false, name: "[target] invalid week string(2000-w01)"},
+ {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"}
]
},
{
@@ -91,13 +91,13 @@
{conditions: {required: true, value: "12:00:00.001"}, expected: false, name: "[target] Valid time string(12:00:60.001)"},
{conditions: {required: true, value: "12:00:00.01"}, expected: false, name: "[target] Valid time string(12:00:60.01)"},
{conditions: {required: true, value: "12:00:00.1"}, expected: false, name: "[target] Valid time string(12:00:60.1)"},
- {conditions: {required: true, value: 1234567}, expected: true, name: "[target] The value attribute is a number(1234567)"},
- {conditions: {required: true, value: new Date()}, expected: true, name: "[target] The value attribute is a time object"},
- {conditions: {required: true, value: "25:00:00"}, expected: true, name: "[target] Invalid time string(25:00:00)"},
- {conditions: {required: true, value: "12:60:00"}, expected: true, name: "[target] Invalid time string(12:60:00)"},
- {conditions: {required: true, value: "12:00:60"}, expected: true, name: "[target] Invalid time string(12:00:60)"},
- {conditions: {required: true, value: "12:00:00:001"}, expected: true, name: "[target] Invalid time string(12:00:00:001)"},
- {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"}
+ {conditions: {required: true, value: 1234567}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a number(1234567)"},
+ {conditions: {required: true, value: new Date()}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a time object"},
+ {conditions: {required: true, value: "25:00:00"}, expected: true, expectedImmutable: false, name: "[target] Invalid time string(25:00:00)"},
+ {conditions: {required: true, value: "12:60:00"}, expected: true, expectedImmutable: false, name: "[target] Invalid time string(12:60:00)"},
+ {conditions: {required: true, value: "12:00:60"}, expected: true, expectedImmutable: false, name: "[target] Invalid time string(12:00:60)"},
+ {conditions: {required: true, value: "12:00:00:001"}, expected: true, expectedImmutable: false, name: "[target] Invalid time string(12:00:00:001)"},
+ {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"}
]
},
{
@@ -110,11 +110,11 @@
{conditions: {required: true, value: "123.01e-10"}, expected: false, name: "[target] Value is a number in scientific notation form(e is in lowercase)"},
{conditions: {required: true, value: "123.01E+10"}, expected: false, name: "[target] Value is a number in scientific notation form(E is in uppercase)"},
{conditions: {required: true, value: "-0"}, expected: false, name: "[target] Value is -0"},
- {conditions: {required: true, value: " 123 "}, expected: true, name: "[target] Value is a number with some white spaces"},
- {conditions: {required: true, value: Math.pow(2, 1024)}, expected: true, name: "[target] Value is Math.pow(2, 1024)"},
- {conditions: {required: true, value: Math.pow(-2, 1024)}, expected: true, name: "[target] Value is Math.pow(-2, 1024)"},
- {conditions: {required: true, value: "abc"}, expected: true, name: "[target] Value is a string that cannot be converted to a number"},
- {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"}
+ {conditions: {required: true, value: " 123 "}, expected: true, expectedImmutable: false, name: "[target] Value is a number with some white spaces"},
+ {conditions: {required: true, value: Math.pow(2, 1024)}, expected: true, expectedImmutable: false, name: "[target] Value is Math.pow(2, 1024)"},
+ {conditions: {required: true, value: Math.pow(-2, 1024)}, expected: true, expectedImmutable: false, name: "[target] Value is Math.pow(-2, 1024)"},
+ {conditions: {required: true, value: "abc"}, expected: true, expectedImmutable: false, name: "[target] Value is a string that cannot be converted to a number"},
+ {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"}
]
},
{
@@ -159,7 +159,7 @@
testData: [
{conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"},
{conditions: {required: true, value: "abc"}, expected: false, name: "[target] The value is not empty"},
- {conditions: {required: true, value: ""}, expected: true , name: "[target] The value is empty"}
+ {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value is empty"}
]
}
];
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/support/validator.js b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/support/validator.js
index 48c3a5b40e6..33508fb3289 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/support/validator.js
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/support/validator.js
@@ -5,8 +5,8 @@ var validator = {
test(function() {
self.pre_check(ctl, 'tooLong');
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.tooLong,
'The validity.tooLong should be true' + condStr);
@@ -23,8 +23,8 @@ var validator = {
test(function () {
self.pre_check(ctl, "tooShort");
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.tooShort,
'The validity.tooShort should be true' + condStr);
@@ -41,8 +41,8 @@ var validator = {
test(function () {
self.pre_check(ctl, "patternMismatch");
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.patternMismatch,
'The validity.patternMismatch should be true' + condStr);
@@ -59,8 +59,8 @@ var validator = {
test(function () {
self.pre_check(ctl, "valueMissing");
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.valueMissing,
'The validity.valueMissing should be true' + condStr);
@@ -77,8 +77,8 @@ var validator = {
test(function () {
self.pre_check(ctl, "typeMismatch");
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.typeMismatch,
'The validity.typeMismatch should be true' + condStr);
@@ -95,8 +95,8 @@ var validator = {
test(function () {
self.pre_check(ctl, "rangeOverflow");
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.rangeOverflow,
'The validity.rangeOverflow should be true' + condStr);
@@ -113,8 +113,8 @@ var validator = {
test(function () {
self.pre_check(ctl, "rangeUnderflow");
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.rangeUnderflow,
'The validity.rangeUnderflow should be true' + condStr);
@@ -131,8 +131,8 @@ var validator = {
test(function () {
self.pre_check(ctl, "stepMismatch");
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.stepMismatch,
'The validity.stepMismatch should be true' + condStr);
@@ -149,8 +149,8 @@ var validator = {
test(function () {
self.pre_check(ctl, "badInput");
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.badInput,
'The validity.badInput should be true' + condStr);
@@ -167,14 +167,14 @@ var validator = {
test(function () {
self.pre_check(ctl, "customError");
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected) {
+ const {ctl, expected, condStr} = val;
+ if (expected) {
assert_true(
ctl.validity.customError,
'The validity.customError attribute should be true' + condStr);
// validationMessage returns the empty string if ctl is barred from
- // constraint validation, which happens if ctl is disabled.
- if (ctl.disabled) {
+ // constraint validation, which happens if ctl is disabled or readOnly.
+ if (ctl.disabled || ctl.readOnly) {
assert_equals(
ctl.validationMessage, '',
'The validationMessage attribute must be empty' + condStr);
@@ -200,8 +200,8 @@ var validator = {
var self = this;
test(function () {
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.valid,
'The validity.valid should be true' + condStr);
@@ -389,39 +389,54 @@ var validator = {
},
iterate_over: function(ctl, data) {
- // Iterate over normal, disabled, readonly, and both.
+ // Iterate over normal, disabled, readonly, and both (if applicable).
+ var ctlNormal = ctl.cloneNode(true);
+ this.set_conditions(ctlNormal, data.conditions);
+ if (data.dirty)
+ this.set_dirty(ctlNormal);
+
var ctlDisabled = ctl.cloneNode(true);
this.set_conditions(ctlDisabled, data.conditions);
if (data.dirty)
this.set_dirty(ctlDisabled);
ctlDisabled.disabled = true;
- var ctlReadonly = ctl.cloneNode(true);
- this.set_conditions(ctlReadonly, data.conditions);
- if (data.dirty)
- this.set_dirty(ctlReadonly);
- ctlReadonly.readonly = true;
+ var expectedImmutable =
+ data.expectedImmutable !== undefined ? data.expectedImmutable : data.expected;
- var ctlBoth = ctl.cloneNode(true);
- this.set_conditions(ctlBoth, data.conditions);
- if (data.dirty)
- this.set_dirty(ctlBoth);
- ctlBoth.disabled = true;
- ctlBoth.readonly = true;
-
- ctl = ctl.cloneNode(true);
- this.set_conditions(ctl, data.conditions);
-
- return [
- {ctl: ctl, data: data, condStr: '.'},
- {ctl: ctlDisabled, data: data, condStr: ', when control is disabled.'},
- {ctl: ctlReadonly, data: data, condStr: ', when control is readonly.'},
- {
+ var variants = [
+ {ctl: ctlNormal, expected: data.expected, condStr: '.'},
+ {ctl: ctlDisabled, expected: expectedImmutable, condStr: ', when control is disabled.'},
+ ];
+
+ if ('readOnly' in ctl) {
+ var ctlReadonly = ctl.cloneNode(true);
+ this.set_conditions(ctlReadonly, data.conditions);
+ if (data.dirty)
+ this.set_dirty(ctlReadonly);
+ ctlReadonly.readOnly = true;
+
+ var ctlBoth = ctl.cloneNode(true);
+ this.set_conditions(ctlBoth, data.conditions);
+ if (data.dirty)
+ this.set_dirty(ctlBoth);
+ ctlBoth.disabled = true;
+ ctlBoth.readOnly = true;
+
+ variants.push({
+ ctl: ctlReadonly,
+ expected: expectedImmutable,
+ condStr: ', when control is readonly.'
+ });
+
+ variants.push({
ctl: ctlBoth,
- data: data,
+ expected: expectedImmutable,
condStr: ', when control is disabled & readonly.'
- },
- ]
+ });
+ }
+
+ return variants;
},
run_test: function(testee, method) {
diff --git a/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js b/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js
index 4bafc9b0ad8..2c1724b7592 100644
--- a/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js
+++ b/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js
@@ -170,6 +170,7 @@ var WebNFCTest = (() => {
this.reading_messages_ = [];
this.operations_suspended_ = false;
this.is_formatted_tag_ = false;
+ this.data_transfer_failed_ = false;
}
// NFC delegate functions.
@@ -192,6 +193,9 @@ var WebNFCTest = (() => {
// Resolves with NotAllowedError if there are NDEF records on the device
// and overwrite is false.
resolve(createNDEFError(device.mojom.NDEFErrorType.NOT_ALLOWED));
+ } else if (this.data_transfer_failed_) {
+ // Resolves with NetworkError if data transfer fails.
+ resolve(createNDEFError(device.mojom.NDEFErrorType.IO_ERROR));
} else {
resolve(createNDEFError(null));
}
@@ -290,6 +294,7 @@ var WebNFCTest = (() => {
this.operations_suspended_ = false;
this.cancelPendingPushOperation();
this.is_formatted_tag_ = false;
+ this.data_transfer_failed_ = false;
}
cancelPendingPushOperation() {
@@ -365,6 +370,10 @@ var WebNFCTest = (() => {
setIsFormattedTag(isFormatted) {
this.is_formatted_tag_ = isFormatted;
}
+
+ simulateDataTransferFails() {
+ this.data_transfer_failed_ = true;
+ }
}
let testInternal = {
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
index 33b5d51e54e..fee528071f6 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
@@ -8,7 +8,8 @@ from .base import (get_free_port,
cmd_arg,
browser_command)
from ..executors.executormarionette import (MarionetteTestharnessExecutor, # noqa: F401
- MarionetteRefTestExecutor) # noqa: F401
+ MarionetteRefTestExecutor, # noqa: F401
+ MarionetteCrashtestExecutor) # noqa: F401
from .firefox import (get_timeout_multiplier, # noqa: F401
run_info_extras as fx_run_info_extras,
update_properties, # noqa: F401
@@ -20,7 +21,8 @@ __wptrunner__ = {"product": "firefox_android",
"check_args": "check_args",
"browser": "FirefoxAndroidBrowser",
"executor": {"testharness": "MarionetteTestharnessExecutor",
- "reftest": "MarionetteRefTestExecutor"},
+ "reftest": "MarionetteRefTestExecutor",
+ "crashtest": "MarionetteCrashtestExecutor"},
"browser_kwargs": "browser_kwargs",
"executor_kwargs": "executor_kwargs",
"env_extras": "env_extras",
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py
index 59f7e865a5b..01306397db7 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py
@@ -991,15 +991,16 @@ class MarionetteCrashtestExecutor(CrashtestExecutor):
if not success:
status = data[0]
+ extra = None
if self.debug and (success or status not in ("CRASH", "INTERNAL-ERROR")):
assertion_count = self.protocol.asserts.get()
if assertion_count is not None:
- data["extra"] = {"assertion_count": assertion_count}
+ extra = {"assertion_count": assertion_count}
if success:
return self.convert_result(test, data)
- return (test.result_cls(**data), [])
+ return (test.result_cls(extra=extra, *data), [])
def do_crashtest(self, protocol, url, timeout):
if self.protocol.coverage.is_enabled:
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/test-wait.js b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/test-wait.js
index 8a7edb79d62..ad08ad7d76f 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/test-wait.js
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/test-wait.js
@@ -32,7 +32,8 @@ function wait_paints() {
}
function screenshot_if_ready() {
- if (root.classList.contains("%(classname)s") &&
+ if (root &&
+ root.classList.contains("%(classname)s") &&
observer === null) {
observer = new MutationObserver(wait_paints);
observer.observe(root, {attributes: true});
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py
index 6647a8580be..daf0a1c1bfa 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py
@@ -1,5 +1,4 @@
import ctypes
-import logging
import os
import platform
import plistlib
@@ -12,7 +11,8 @@ SYSTEM = platform.system().lower()
class FontInstaller(object):
- def __init__(self, font_dir=None, **fonts):
+ def __init__(self, logger, font_dir=None, **fonts):
+ self.logger = logger
self.font_dir = font_dir
self.installed_fonts = False
self.created_dir = False
@@ -26,14 +26,13 @@ class FontInstaller(object):
font_name = font_path.split('/')[-1]
install = getattr(self, 'install_%s_font' % SYSTEM, None)
if not install:
- logging.warning('Font installation not supported on %s',
- SYSTEM)
+ self.logger.warning('Font installation not supported on %s' % SYSTEM)
return False
if install(font_name, font_path):
self.installed_fonts = True
- logging.info('Installed font: %s', font_name)
+ self.logger.info('Installed font: %s' % font_name)
else:
- logging.warning('Unable to install font: %s', font_name)
+ self.logger.warning('Unable to install font: %s' % font_name)
def __exit__(self, exc_type, exc_val, exc_tb):
if not self.installed_fonts:
@@ -43,12 +42,12 @@ class FontInstaller(object):
font_name = font_path.split('/')[-1]
remove = getattr(self, 'remove_%s_font' % SYSTEM, None)
if not remove:
- logging.warning('Font removal not supported on %s', SYSTEM)
+ self.logger.warning('Font removal not supported on %s' % SYSTEM)
return False
if remove(font_name, font_path):
- logging.info('Removed font: %s', font_name)
+ self.logger.info('Removed font: %s' % font_name)
else:
- logging.warning('Unable to remove font: %s', font_name)
+ self.logger.warning('Unable to remove font: %s' % font_name)
def install_linux_font(self, font_name, font_path):
if not self.font_dir:
@@ -62,7 +61,7 @@ class FontInstaller(object):
fc_cache_returncode = call('fc-cache')
return not fc_cache_returncode
except OSError: # If fontconfig doesn't exist, return False
- logging.error('fontconfig not available on this Linux system.')
+ self.logger.error('fontconfig not available on this Linux system.')
return False
def install_darwin_font(self, font_name, font_path):
@@ -110,7 +109,7 @@ class FontInstaller(object):
fc_cache_returncode = call('fc-cache')
return not fc_cache_returncode
except OSError: # If fontconfig doesn't exist, return False
- logging.error('fontconfig not available on this Linux system.')
+ self.logger.error('fontconfig not available on this Linux system.')
return False
def remove_darwin_font(self, font_name, _):
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py
index 7409dc26560..75ce104c7ce 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py
@@ -150,6 +150,7 @@ def run_tests(config, test_paths, product, **kwargs):
if kwargs["install_fonts"]:
env_extras.append(FontInstaller(
+ logger,
font_dir=kwargs["font_dir"],
ahem=os.path.join(test_paths["/"]["tests_path"], "fonts/Ahem.ttf")
))
diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan.https.html
index a9b1d751617..17b9fdb8569 100644
--- a/tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan.https.html
+++ b/tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan.https.html
@@ -207,4 +207,27 @@ nfc_test(async (t, mockNFC) => {
}, "Test that NDEFReader.onreading should be fired on an unformatted NFC tag \
with empty records array for NDEFMessage.");
+nfc_test(async (t, mockNFC) => {
+ const reader = new NDEFReader();
+ const controller = new AbortController();
+ const message = createMessage([createTextRecord(test_text_data),
+ createMimeRecordFromJson(test_json_data),
+ createMimeRecord(test_buffer_data),
+ createUnknownRecord(test_buffer_data),
+ createUrlRecord(test_url_data),
+ createUrlRecord(test_url_data, true),
+ createRecord('w3.org:xyz', test_buffer_data)],
+ test_message_origin);
+ const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
+ const promise = readerWatcher.wait_for("reading").then(event => {
+ assert_equals(event.serialNumber, fake_tag_serial_number);
+ assertWebNDEFMessagesEqual(event.message, new NDEFMessage(message));
+ controller.abort();
+ });
+ await reader.scan({signal : controller.signal});
+
+ mockNFC.setReadingMessage(message);
+ await promise;
+}, "Test that reading message with multiple records should succeed.");
+
</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html
index 4ff0af8fb0b..cb6b3941410 100644
--- a/tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html
+++ b/tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html
@@ -276,7 +276,7 @@ nfc_test(async () => {
nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
- let message = createMessage([createTextRecord(test_text_data),
+ const message = createMessage([createTextRecord(test_text_data),
createMimeRecordFromJson(test_json_data),
createMimeRecord(test_buffer_data),
createUnknownRecord(test_buffer_data),
@@ -308,9 +308,12 @@ nfc_test(async (t, mockNFC) => {
assertNDEFMessagesEqual(buffer_view, mockNFC.pushedMessage());
}, "Test that NDEFWriter.push succeeds when message is ArrayBufferView.");
-nfc_test(async () => {
+nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
await writer.push(createMessage([createRecord('empty')]));
+ const receivedMessage = mockNFC.pushedMessage();
+ assert_equals(receivedMessage.data.length, 1);
+ assert_equals(receivedMessage.data[0].recordType, 'empty', 'recordType');
}, "NDEFWriter.push with 'empty' record should succeed.");
nfc_test(async (t, mockNFC) => {
@@ -433,4 +436,11 @@ nfc_test(async (t, mockNFC) => {
await promise_rejects(t, 'NotAllowedError', p);
}, "NDEFWriter.push should fail when there are NDEF records on the NFC device \
and NDEFPushOptions.overwrite is false.");
+
+nfc_test(async (t, mockNFC) => {
+ const writer = new NDEFWriter();
+ mockNFC.simulateDataTransferFails();
+ await promise_rejects(t, 'NetworkError', writer.push(test_text_data));
+}, "NDEFWriter.push should fail with NetworkError when NFC data transfer fails.");
+
</script>