diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini deleted file mode 100644 index f64b45fea6b..00000000000 --- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-002.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[hit-test-floats-002.html] - [Hit test float] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-004.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-004.html.ini deleted file mode 100644 index 4bfb0c2053a..00000000000 --- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-004.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[hit-test-floats-004.html] - [Miss float below something else] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini index f8e7e539aae..4a1e8110f6f 100644 --- a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini @@ -2,6 +2,3 @@ [Hit test intersecting scaled box] expected: FAIL - [Hit test within unscaled box] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/css/css-transitions/no-transition-from-ua-to-blocking-stylesheet.html.ini b/tests/wpt/metadata-layout-2020/css/css-transitions/no-transition-from-ua-to-blocking-stylesheet.html.ini deleted file mode 100644 index 70a00a101f6..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-transitions/no-transition-from-ua-to-blocking-stylesheet.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[no-transition-from-ua-to-blocking-stylesheet.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPosition.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPosition.html.ini index 23c61ede1a1..c131078eace 100644 --- a/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPosition.html.ini +++ b/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPosition.html.ini @@ -17,6 +17,3 @@ [test the top of layer] expected: FAIL - [test some point of the element: top left corner] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini new file mode 100644 index 00000000000..e181af5397f --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini @@ -0,0 +1,4 @@ +[elementsFromPoint-invalid-cases.html] + [The root element is the last element returned for otherwise empty queries within the viewport] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/custom-elements/form-associated/ElementInternals-setFormValue.html.ini b/tests/wpt/metadata-layout-2020/custom-elements/form-associated/ElementInternals-setFormValue.html.ini new file mode 100644 index 00000000000..e007d9d4956 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/custom-elements/form-associated/ElementInternals-setFormValue.html.ini @@ -0,0 +1,80 @@ +[ElementInternals-setFormValue.html] + expected: ERROR + [Newline normalization - \\n\\r in value] + expected: FAIL + + [Single value - name is missing] + expected: FAIL + + [Single value - Non-empty name exists] + expected: FAIL + + [Null value should submit nothing] + expected: FAIL + + [Newline normalization - \\n in name] + expected: FAIL + + [Newline normalization - \\r\\n in filename] + expected: FAIL + + [Newline normalization - \\r in FormData name] + expected: FAIL + + [Newline normalization - \\r\\n in FormData value] + expected: FAIL + + [Newline normalization - \\r\\n in FormData name] + expected: FAIL + + [Newline normalization - \\n\\r in FormData name] + expected: FAIL + + [Newline normalization - \\n in value] + expected: FAIL + + [Newline normalization - \\r in FormData value] + expected: FAIL + + [Newline normalization - \\n\\r in name] + expected: FAIL + + [Newline normalization - \\r in filename] + expected: FAIL + + [Newline normalization - \\r\\n in name] + expected: FAIL + + [Newline normalization - \\n\\r in FormData value] + expected: FAIL + + [setFormValue with an empty FormData should submit nothing] + expected: FAIL + + [Single value - empty name exists] + expected: FAIL + + [Newline normalization - \\n in filename] + expected: FAIL + + [Newline normalization - \\n in FormData name] + expected: FAIL + + [Newline normalization - \\r in name] + expected: FAIL + + [Multiple values - name content attribute is ignored] + expected: FAIL + + [Newline normalization - \\r in value] + expected: FAIL + + [Newline normalization - \\r\\n in value] + expected: FAIL + + [Newline normalization - \\n in FormData value] + expected: FAIL + + [Newline normalization - \\n\\r in filename] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini b/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini index 556bb44ee43..7ef1040edb9 100644 --- a/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini +++ b/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini @@ -312,12 +312,6 @@ ['; + if (name !== undefined) { + $('my-control').setAttribute("name", name); + } + if (Array.isArray(value)) { + $('my-control').setValues(value); + } else { + $('my-control').value = value; + } + const query = await submitPromise(t); + assert_equals(query, `?${expectedName}=${expectedValue}`); + }, description); +} + promise_test(t => { $('#container').innerHTML = '
' + '' + @@ -122,4 +141,156 @@ promise_test(t => { assert_equals(query, '?name-pd1=value-pd1'); }); }, 'setFormValue with an empty FormData should submit nothing'); + +testSerializedEntry({ + name: 'a\nb', + value: 'c', + expectedName: 'a%0D%0Ab', + expectedValue: 'c', + description: 'Newline normalization - \\n in name' +}); + +testSerializedEntry({ + name: 'a\rb', + value: 'c', + expectedName: 'a%0D%0Ab', + expectedValue: 'c', + description: 'Newline normalization - \\r in name' +}); + +testSerializedEntry({ + name: 'a\r\nb', + value: 'c', + expectedName: 'a%0D%0Ab', + expectedValue: 'c', + description: 'Newline normalization - \\r\\n in name' +}); + +testSerializedEntry({ + name: 'a\n\rb', + value: 'c', + expectedName: 'a%0D%0A%0D%0Ab', + expectedValue: 'c', + description: 'Newline normalization - \\n\\r in name' +}); + +testSerializedEntry({ + name: 'a', + value: 'b\nc', + expectedName: 'a', + expectedValue: 'b%0D%0Ac', + description: 'Newline normalization - \\n in value' +}); + +testSerializedEntry({ + name: 'a', + value: 'b\rc', + expectedName: 'a', + expectedValue: 'b%0D%0Ac', + description: 'Newline normalization - \\r in value' +}); + +testSerializedEntry({ + name: 'a', + value: 'b\r\nc', + expectedName: 'a', + expectedValue: 'b%0D%0Ac', + description: 'Newline normalization - \\r\\n in value' +}); + +testSerializedEntry({ + name: 'a', + value: 'b\n\rc', + expectedName: 'a', + expectedValue: 'b%0D%0A%0D%0Ac', + description: 'Newline normalization - \\n\\r in value' +}); + +testSerializedEntry({ + name: 'a', + value: new File([], "b\nc"), + expectedName: 'a', + expectedValue: 'b%0D%0Ac', + description: 'Newline normalization - \\n in filename' +}); + +testSerializedEntry({ + name: 'a', + value: new File([], "b\rc"), + expectedName: 'a', + expectedValue: 'b%0D%0Ac', + description: 'Newline normalization - \\r in filename' +}); + +testSerializedEntry({ + name: 'a', + value: new File([], "b\r\nc"), + expectedName: 'a', + expectedValue: 'b%0D%0Ac', + description: 'Newline normalization - \\r\\n in filename' +}); + +testSerializedEntry({ + name: 'a', + value: new File([], "b\n\rc"), + expectedName: 'a', + expectedValue: 'b%0D%0A%0D%0Ac', + description: 'Newline normalization - \\n\\r in filename' +}); + +testSerializedEntry({ + value: [['a\nb', 'c']], + expectedName: 'a%0Ab', + expectedValue: 'c', + description: 'Newline normalization - \\n in FormData name' +}); + +testSerializedEntry({ + value: [['a\rb', 'c']], + expectedName: 'a%0Db', + expectedValue: 'c', + description: 'Newline normalization - \\r in FormData name' +}); + +testSerializedEntry({ + value: [['a\r\nb', 'c']], + expectedName: 'a%0D%0Ab', + expectedValue: 'c', + description: 'Newline normalization - \\r\\n in FormData name' +}); + +testSerializedEntry({ + value: [['a\n\rb', 'c']], + expectedName: 'a%0A%0Db', + expectedValue: 'c', + description: 'Newline normalization - \\n\\r in FormData name' +}); + +testSerializedEntry({ + value: [['a', 'b\nc']], + expectedName: 'a', + expectedValue: 'b%0Ac', + description: 'Newline normalization - \\n in FormData value' +}); + +testSerializedEntry({ + value: [['a', 'b\rc']], + expectedName: 'a', + expectedValue: 'b%0Dc', + description: 'Newline normalization - \\r in FormData value' +}); + +testSerializedEntry({ + value: [['a', 'b\r\nc']], + expectedName: 'a', + expectedValue: 'b%0D%0Ac', + description: 'Newline normalization - \\r\\n in FormData value' +}); + +testSerializedEntry({ + value: [['a', 'b\n\rc']], + expectedName: 'a', + expectedValue: 'b%0A%0Dc', + description: 'Newline normalization - \\n\\r in FormData value' +}); diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/selection.html b/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/selection.html index e216d953cef..04ab7298e35 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/selection.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/selection.html @@ -155,10 +155,52 @@ test(function() { - var el = createInputElement(sampleText); + var el = createTextareaElement(sampleText); assert_in_array(el.selectionDirection, dirs, "SelectionDirection"); el.select(); assert_in_array(el.selectionDirection, dirs, "SelectionDirection"); el.parentNode.removeChild(el); }, "test SelectionDirection for textarea"); + + promise_test(async () => { + // cause a layout overflow + const el = createInputElement(sampleText.repeat(100)); + el.selectionEnd = 0; + await new Promise(requestAnimationFrame); + assert_equals(el.scrollLeft, 0); + + el.select(); + await new Promise(requestAnimationFrame); + assert_equals(el.scrollLeft, 0); + el.remove(); + }, `test scrollLeft for input`); + + promise_test(async () => { + // cause a layout overflow + const el = createInputElement(sampleText.repeat(100)); + el.scrollLeft = 33; + + el.select(); + await new Promise(requestAnimationFrame); + assert_equals(el.scrollLeft, 33); + el.remove(); + }, `test scrollLeft preservation for input`); + + for (const localName of ["input", "textarea"]) { + promise_test(async () => { + const container = document.createElement("div"); + container.style.height = "100px"; + container.style.overflow = "scroll"; + const element = document.createElement(localName); + element.style.marginTop = "120px"; + container.append(element); + document.body.append(container); + + element.select(); + await new Promise(requestAnimationFrame); + assert_equals(container.scrollTop, 0); + + container.remove(); + }, `test container.scrollTop for ${localName}`); + } diff --git a/tests/wpt/web-platform-tests/interfaces/serial.idl b/tests/wpt/web-platform-tests/interfaces/serial.idl index 7bca7477573..8612f6f0a2c 100644 --- a/tests/wpt/web-platform-tests/interfaces/serial.idl +++ b/tests/wpt/web-platform-tests/interfaces/serial.idl @@ -1,7 +1,7 @@ // GENERATED CONTENT - DO NOT EDIT // Content was automatically extracted by Reffy into webref // (https://github.com/w3c/webref) -// Source: Serial API (https://wicg.github.io/serial/) +// Source: Web Serial API (https://wicg.github.io/serial/) [Exposed=Window, SecureContext] partial interface Navigator { @@ -18,40 +18,67 @@ interface Serial : EventTarget { attribute EventHandler onconnect; attribute EventHandler ondisconnect; Promise> getPorts(); - [Exposed=Window] Promise requestPort(optional SerialOptions options = {}); + [Exposed=Window] Promise requestPort(optional SerialPortRequestOptions options = {}); +}; + +dictionary SerialPortRequestOptions { + sequence filters; +}; + +dictionary SerialPortFilter { + unsigned short usbVendorId; + unsigned short usbProductId; }; [Exposed=(DedicatedWorker,Window), SecureContext] -interface SerialPort { - Promise open(optional SerialOptions options = {}); - readonly attribute ReadableStream in; - readonly attribute WritableStream out; +interface SerialPort : EventTarget { + attribute EventHandler onconnect; + attribute EventHandler ondisconnect; + readonly attribute ReadableStream readable; + readonly attribute WritableStream writable; + SerialPortInfo getInfo(); + + Promise open(SerialOptions options); + Promise setSignals(optional SerialOutputSignals signals = {}); + Promise getSignals(); + Promise close(); }; -[Exposed=(DedicatedWorker,Window), SecureContext] -interface SerialPortInfo { - maplike; +dictionary SerialPortInfo { + unsigned short usbVendorId; + unsigned short usbProductId; }; dictionary SerialOptions { - long baudRate = 9600; - octet dataBits = 8; - octet stopBits = 1; + required [EnforceRange] unsigned long baudRate; + [EnforceRange] octet dataBits = 8; + [EnforceRange] octet stopBits = 1; ParityType parity = "none"; - long bufferSize = 255; + [EnforceRange] unsigned long bufferSize = 255; FlowControlType flowControl = "none"; }; enum ParityType { "none", "even", - "odd", - "mark", - "space" + "odd" }; enum FlowControlType { "none", "hardware" }; + +dictionary SerialOutputSignals { + boolean dataTerminalReady; + boolean requestToSend; + boolean break; +}; + +dictionary SerialInputSignals { + required boolean dataCarrierDetect; + required boolean clearToSend; + required boolean ringIndicator; + required boolean dataSetReady; +};