mirror of
https://github.com/servo/servo.git
synced 2025-08-04 05:00:08 +01:00
Update web-platform-tests to revision d23db97703021bdeb4ec21ff5ce3e9de54dd4d85
This commit is contained in:
parent
54d2b7de29
commit
77784e512e
163 changed files with 3806 additions and 3068 deletions
|
@ -1,4 +0,0 @@
|
|||
[hit-test-floats-004.html]
|
||||
[Miss float below something else]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
[font-language-override-02.html]
|
||||
expected: FAIL
|
|
@ -2,3 +2,6 @@
|
|||
[Hit test intersecting scaled box]
|
||||
expected: FAIL
|
||||
|
||||
[Hit test within unscaled box]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[elementsFromPoint-invalid-cases.html]
|
||||
[The root element is the last element returned for otherwise empty queries within the viewport]
|
||||
expected: FAIL
|
||||
|
|
@ -312,9 +312,6 @@
|
|||
[Response: combined response Content-Type: text/html;" \\" text/plain ";charset=GBK]
|
||||
expected: NOTRUN
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -324,15 +321,15 @@
|
|||
[<iframe>: separate response Content-Type: text/html;" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/plain */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html;x=" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;" \\" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -56,6 +56,6 @@
|
|||
[separate text/javascript x/x]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript;charset=windows-1252 error text/javascript]
|
||||
[separate text/javascript error]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -11,3 +11,6 @@
|
|||
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
|
||||
expected: FAIL
|
||||
|
||||
[X-Content-Type-Options%3A%20no%0D%0AX-Content-Type-Options%3A%20nosniff]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
[traverse_the_history_4.html]
|
||||
[traverse_the_history_5.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
[embedded-opener-remove-frame.html]
|
||||
expected: CRASH
|
||||
[opener of discarded nested browsing context]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
[cross-domain-iframe.sub.html]
|
||||
expected: TIMEOUT
|
|
@ -1,8 +1,5 @@
|
|||
[hash-name-reference.html]
|
||||
expected: ERROR
|
||||
[HTML (standards) IMG usemap="no-hash-name"]
|
||||
expected: FAIL
|
||||
|
||||
[HTML (quirks) IMG usemap="#percent-escape-id-%42"]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
[iframe_sandbox_popups_nonescaping-1.html]
|
||||
expected: TIMEOUT
|
||||
expected: CRASH
|
||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||
expected: NOTRUN
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
[iframe_sandbox_popups_nonescaping-2.html]
|
||||
expected: TIMEOUT
|
||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||
expected: NOTRUN
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
[iframe_sandbox_popups_nonescaping-3.html]
|
||||
expected: CRASH
|
||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||
expected: NOTRUN
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[form-submit-iframe-then-location-navigate.html]
|
||||
[Verifies that location navigations take precedence when following form submissions.]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
[dynamic-content-change-rendering.html]
|
||||
expected: TIMEOUT
|
|
@ -3,6 +3,3 @@
|
|||
[The incumbent settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
|
||||
expected: TIMEOUT
|
||||
|
||||
[The entry settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,237 @@
|
|||
[async-iterator.any.serviceworker.html]
|
||||
expected: ERROR
|
||||
|
||||
[async-iterator.any.sharedworker.html]
|
||||
expected: ERROR
|
||||
|
||||
[async-iterator.any.html]
|
||||
[return() rejects if the stream has errored]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating an empty but not closed/errored stream never executes the loop body and stalls the async function]
|
||||
expected: FAIL
|
||||
|
||||
[Cancellation behavior when manually calling return(); preventCancel = true]
|
||||
expected: FAIL
|
||||
|
||||
[values() throws if there's already a lock]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a pull source with undefined values]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; return() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a push source]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a closed stream never executes the loop body, but works fine]
|
||||
expected: FAIL
|
||||
|
||||
[Acquiring a reader after exhaustively async-iterating a stream]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; next() that reports an error(); next() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; next() that reports an error; next()]
|
||||
expected: FAIL
|
||||
|
||||
[return(); return() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[Async iterator instances should have the correct list of properties]
|
||||
expected: FAIL
|
||||
|
||||
[return() should unlock the stream synchronously when preventCancel = false]
|
||||
expected: FAIL
|
||||
|
||||
[Acquiring a reader and reading the remaining chunks after partially async-iterating a stream with preventCancel = true]
|
||||
expected: FAIL
|
||||
|
||||
[Cancellation behavior when breaking inside loop body; preventCancel = true]
|
||||
expected: FAIL
|
||||
|
||||
[Cancellation behavior when manually calling return(); preventCancel = false]
|
||||
expected: FAIL
|
||||
|
||||
[Cancellation behavior when throwing inside loop body; preventCancel = true]
|
||||
expected: FAIL
|
||||
|
||||
[Cancellation behavior when returning inside loop body; preventCancel = true]
|
||||
expected: FAIL
|
||||
|
||||
[return(); return()]
|
||||
expected: FAIL
|
||||
|
||||
[Cancellation behavior when throwing inside loop body; preventCancel = false]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; next() that reports an error(); return() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[Acquiring a reader after partially async-iterating a stream]
|
||||
expected: FAIL
|
||||
|
||||
[next() rejects if the stream errors]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a pull source]
|
||||
expected: FAIL
|
||||
|
||||
[return() should unlock the stream synchronously when preventCancel = true]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a push source with undefined values]
|
||||
expected: FAIL
|
||||
|
||||
[return(); next() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a partially consumed stream]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; return()]
|
||||
expected: FAIL
|
||||
|
||||
[Cancellation behavior when returning inside loop body; preventCancel = false]
|
||||
expected: FAIL
|
||||
|
||||
[return(); next()]
|
||||
expected: FAIL
|
||||
|
||||
[Acquiring a reader after return()ing from a stream that errors]
|
||||
expected: FAIL
|
||||
|
||||
[Cancellation behavior when breaking inside loop body; preventCancel = false]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; next() that reports an error(); return()]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a pull source manually]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating an errored stream throws]
|
||||
expected: FAIL
|
||||
|
||||
[return() does not rejects if the stream has not errored yet]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[async-iterator.any.worker.html]
|
||||
[return() rejects if the stream has errored]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating an empty but not closed/errored stream never executes the loop body and stalls the async function]
|
||||
expected: FAIL
|
||||
|
||||
[Cancellation behavior when manually calling return(); preventCancel = true]
|
||||
expected: FAIL
|
||||
|
||||
[values() throws if there's already a lock]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a pull source with undefined values]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; return() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a push source]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a closed stream never executes the loop body, but works fine]
|
||||
expected: FAIL
|
||||
|
||||
[Acquiring a reader after exhaustively async-iterating a stream]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; next() that reports an error(); next() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; next() that reports an error; next()]
|
||||
expected: FAIL
|
||||
|
||||
[return(); return() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[Async iterator instances should have the correct list of properties]
|
||||
expected: FAIL
|
||||
|
||||
[return() should unlock the stream synchronously when preventCancel = false]
|
||||
expected: FAIL
|
||||
|
||||
[Acquiring a reader and reading the remaining chunks after partially async-iterating a stream with preventCancel = true]
|
||||
expected: FAIL
|
||||
|
||||
[Cancellation behavior when breaking inside loop body; preventCancel = true]
|
||||
expected: FAIL
|
||||
|
||||
[Cancellation behavior when manually calling return(); preventCancel = false]
|
||||
expected: FAIL
|
||||
|
||||
[Cancellation behavior when throwing inside loop body; preventCancel = true]
|
||||
expected: FAIL
|
||||
|
||||
[Cancellation behavior when returning inside loop body; preventCancel = true]
|
||||
expected: FAIL
|
||||
|
||||
[return(); return()]
|
||||
expected: FAIL
|
||||
|
||||
[Cancellation behavior when throwing inside loop body; preventCancel = false]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; next() that reports an error(); return() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[Acquiring a reader after partially async-iterating a stream]
|
||||
expected: FAIL
|
||||
|
||||
[next() rejects if the stream errors]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a pull source]
|
||||
expected: FAIL
|
||||
|
||||
[return() should unlock the stream synchronously when preventCancel = true]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a push source with undefined values]
|
||||
expected: FAIL
|
||||
|
||||
[return(); next() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a partially consumed stream]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; return()]
|
||||
expected: FAIL
|
||||
|
||||
[Cancellation behavior when returning inside loop body; preventCancel = false]
|
||||
expected: FAIL
|
||||
|
||||
[return(); next()]
|
||||
expected: FAIL
|
||||
|
||||
[Acquiring a reader after return()ing from a stream that errors]
|
||||
expected: FAIL
|
||||
|
||||
[Cancellation behavior when breaking inside loop body; preventCancel = false]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; next() that reports an error(); return()]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a pull source manually]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating an errored stream throws]
|
||||
expected: FAIL
|
||||
|
||||
[return() does not rejects if the stream has not errored yet]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
[default-reader.any.worker.html]
|
||||
[Getting a ReadableStreamDefaultReader via getReader should fail if the stream is already locked (via direct construction)]
|
||||
expected: FAIL
|
||||
|
||||
[Constructing a ReadableStreamDefaultReader directly should be OK if the stream is errored]
|
||||
expected: FAIL
|
||||
|
||||
[Constructing a ReadableStreamDefaultReader directly should fail if the stream is already locked (via getReader)]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStreamDefaultReader closed should always return the same promise object]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStreamDefaultReader constructor should get a ReadableStream object as argument]
|
||||
expected: FAIL
|
||||
|
||||
[Constructing a ReadableStreamDefaultReader directly should be OK if the stream is closed]
|
||||
expected: FAIL
|
||||
|
||||
[Constructing a ReadableStreamDefaultReader directly should fail if the stream is already locked (via direct construction)]
|
||||
expected: FAIL
|
||||
|
||||
[getReader() should call ToString() on mode]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[default-reader.any.sharedworker.html]
|
||||
expected: ERROR
|
||||
|
||||
[default-reader.any.serviceworker.html]
|
||||
expected: ERROR
|
||||
|
||||
[default-reader.any.html]
|
||||
expected: ERROR
|
||||
[Getting a ReadableStreamDefaultReader via getReader should fail if the stream is already locked (via direct construction)]
|
||||
expected: FAIL
|
||||
|
||||
[Constructing a ReadableStreamDefaultReader directly should be OK if the stream is errored]
|
||||
expected: FAIL
|
||||
|
||||
[Constructing a ReadableStreamDefaultReader directly should fail if the stream is already locked (via getReader)]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStreamDefaultReader closed should always return the same promise object]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStreamDefaultReader constructor should get a ReadableStream object as argument]
|
||||
expected: FAIL
|
||||
|
||||
[Constructing a ReadableStreamDefaultReader directly should be OK if the stream is closed]
|
||||
expected: FAIL
|
||||
|
||||
[Constructing a ReadableStreamDefaultReader directly should fail if the stream is already locked (via direct construction)]
|
||||
expected: FAIL
|
||||
|
||||
[getReader() should call ToString() on mode]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
[general.any.sharedworker.html]
|
||||
expected: ERROR
|
||||
|
||||
[general.any.serviceworker.html]
|
||||
expected: ERROR
|
||||
|
||||
[general.any.html]
|
||||
[default ReadableStream getReader() should only accept mode:undefined]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStream can't be constructed with an invalid type]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[general.any.worker.html]
|
||||
[default ReadableStream getReader() should only accept mode:undefined]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStream can't be constructed with an invalid type]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
[patched-global.any.serviceworker.html]
|
||||
expected: ERROR
|
||||
|
||||
[patched-global.any.sharedworker.html]
|
||||
expected: ERROR
|
||||
|
||||
[patched-global.any.html]
|
||||
[pipeTo() should not call Promise.prototype.then()]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStream async iterator should use the original values of getReader() and ReadableStreamDefaultReader methods]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[patched-global.any.worker.html]
|
||||
[pipeTo() should not call Promise.prototype.then()]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStream async iterator should use the original values of getReader() and ReadableStreamDefaultReader methods]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
[templated.any.sharedworker.html]
|
||||
expected: ERROR
|
||||
|
||||
[templated.any.serviceworker.html]
|
||||
expected: ERROR
|
||||
|
||||
[templated.any.html]
|
||||
[ReadableStream (empty): calling getReader with invalid arguments should throw appropriate errors]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStream (empty): instances have the correct methods and properties]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[templated.any.worker.html]
|
||||
[ReadableStream (empty): calling getReader with invalid arguments should throw appropriate errors]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStream (empty): instances have the correct methods and properties]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +1,4 @@
|
|||
[realtimeanalyser-fft-scaling.html]
|
||||
expected: TIMEOUT
|
||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
[018.html]
|
||||
expected: TIMEOUT
|
||||
[origin of the script that invoked the method, javascript:]
|
||||
expected: TIMEOUT
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
[Worker-constructor.html]
|
||||
expected: ERROR
|
|
@ -1,5 +1,4 @@
|
|||
[003.html]
|
||||
expected: ERROR
|
||||
[shared]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
[shared-worker-in-data-url-context.window.html]
|
||||
expected: TIMEOUT
|
||||
[Create a shared worker in a data url frame]
|
||||
expected: FAIL
|
||||
|
||||
[Create a data url shared worker in a data url frame]
|
||||
expected: TIMEOUT
|
||||
expected: FAIL
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,4 +0,0 @@
|
|||
[hit-test-floats-004.html]
|
||||
[Miss float below something else]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
[font-language-override-02.html]
|
||||
expected: FAIL
|
|
@ -2,3 +2,6 @@
|
|||
[Hit test intersecting scaled box]
|
||||
expected: FAIL
|
||||
|
||||
[Hit test within unscaled box]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[elementsFromPoint-invalid-cases.html]
|
||||
[The root element is the last element returned for otherwise empty queries within the viewport]
|
||||
expected: FAIL
|
||||
|
|
@ -315,24 +315,21 @@
|
|||
[<iframe>: combined response Content-Type: text/html;" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html;" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/plain */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html;x=" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;" \\" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -56,6 +56,6 @@
|
|||
[separate text/javascript x/x]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript;charset=windows-1252 error text/javascript]
|
||||
[separate text/javascript error]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -11,3 +11,6 @@
|
|||
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
|
||||
expected: FAIL
|
||||
|
||||
[X-Content-Type-Options%3A%20no%0D%0AX-Content-Type-Options%3A%20nosniff]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
[traverse_the_history_4.html]
|
||||
[traverse_the_history_5.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
[embedded-opener-remove-frame.html]
|
||||
expected: CRASH
|
||||
[opener and "removed" embedded documents]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
[cross-domain-iframe.sub.html]
|
||||
expected: TIMEOUT
|
|
@ -172,6 +172,3 @@
|
|||
[XHTML img usemap="http://example.org/#garbage-before-hash-id"]
|
||||
expected: FAIL
|
||||
|
||||
[HTML (standards) IMG usemap="no-hash-name"]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
[iframe_sandbox_popups_nonescaping-1.html]
|
||||
type: testharness
|
||||
expected: TIMEOUT
|
||||
expected: CRASH
|
||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||
expected: NOTRUN
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
[iframe_sandbox_popups_nonescaping-2.html]
|
||||
type: testharness
|
||||
expected: TIMEOUT
|
||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||
expected: NOTRUN
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
[iframe_sandbox_popups_nonescaping-3.html]
|
||||
type: testharness
|
||||
expected: CRASH
|
||||
[Check that popups from a sandboxed iframe do not escape the sandbox]
|
||||
expected: NOTRUN
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[form-submit-iframe-then-location-navigate.html]
|
||||
[Verifies that location navigations take precedence when following form submissions.]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
[dynamic-content-change-rendering.html]
|
||||
expected: TIMEOUT
|
|
@ -4,6 +4,3 @@
|
|||
[The incumbent settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
|
||||
expected: TIMEOUT
|
||||
|
||||
[The entry settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -83,6 +83,57 @@
|
|||
[next()'s fulfillment value has the right shape]
|
||||
expected: FAIL
|
||||
|
||||
[return() rejects if the stream has errored]
|
||||
expected: FAIL
|
||||
|
||||
[values() throws if there's already a lock]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a pull source with undefined values]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; return() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; next() that reports an error(); next() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; next() that reports an error; next()]
|
||||
expected: FAIL
|
||||
|
||||
[return(); return() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[return(); return()]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; next() that reports an error(); return() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[next() rejects if the stream errors]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a push source with undefined values]
|
||||
expected: FAIL
|
||||
|
||||
[return(); next() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; return()]
|
||||
expected: FAIL
|
||||
|
||||
[return(); next()]
|
||||
expected: FAIL
|
||||
|
||||
[Acquiring a reader after return()ing from a stream that errors]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; next() that reports an error(); return()]
|
||||
expected: FAIL
|
||||
|
||||
[return() does not rejects if the stream has not errored yet]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[async-iterator.any.worker.html]
|
||||
[Async-iterating an empty but not closed/errored stream never executes the loop body and stalls the async function]
|
||||
|
@ -163,3 +214,54 @@
|
|||
[next()'s fulfillment value has the right shape]
|
||||
expected: FAIL
|
||||
|
||||
[return() rejects if the stream has errored]
|
||||
expected: FAIL
|
||||
|
||||
[values() throws if there's already a lock]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a pull source with undefined values]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; return() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; next() that reports an error(); next() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; next() that reports an error; next()]
|
||||
expected: FAIL
|
||||
|
||||
[return(); return() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[return(); return()]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; next() that reports an error(); return() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[next() rejects if the stream errors]
|
||||
expected: FAIL
|
||||
|
||||
[Async-iterating a push source with undefined values]
|
||||
expected: FAIL
|
||||
|
||||
[return(); next() [no awaiting\]]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; return()]
|
||||
expected: FAIL
|
||||
|
||||
[return(); next()]
|
||||
expected: FAIL
|
||||
|
||||
[Acquiring a reader after return()ing from a stream that errors]
|
||||
expected: FAIL
|
||||
|
||||
[next() that succeeds; next() that reports an error(); return()]
|
||||
expected: FAIL
|
||||
|
||||
[return() does not rejects if the stream has not errored yet]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,33 +0,0 @@
|
|||
[brand-checks.any.worker.html]
|
||||
[ReadableStreamAsyncIteratorPrototype.next enforces a brand check]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStream.prototype.getIterator enforces a brand check]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStreamAsyncIteratorPrototype.return enforces a brand check]
|
||||
expected: FAIL
|
||||
|
||||
[Can get ReadableStreamAsyncIteratorPrototype object indirectly]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[brand-checks.any.serviceworker.html]
|
||||
expected: ERROR
|
||||
|
||||
[brand-checks.any.html]
|
||||
[ReadableStreamAsyncIteratorPrototype.next enforces a brand check]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStream.prototype.getIterator enforces a brand check]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStreamAsyncIteratorPrototype.return enforces a brand check]
|
||||
expected: FAIL
|
||||
|
||||
[Can get ReadableStreamAsyncIteratorPrototype object indirectly]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[brand-checks.any.sharedworker.html]
|
||||
expected: ERROR
|
|
@ -1,4 +1,28 @@
|
|||
[default-reader.any.worker.html]
|
||||
[Getting a ReadableStreamDefaultReader via getReader should fail if the stream is already locked (via direct construction)]
|
||||
expected: FAIL
|
||||
|
||||
[Constructing a ReadableStreamDefaultReader directly should be OK if the stream is errored]
|
||||
expected: FAIL
|
||||
|
||||
[Constructing a ReadableStreamDefaultReader directly should fail if the stream is already locked (via getReader)]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStreamDefaultReader closed should always return the same promise object]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStreamDefaultReader constructor should get a ReadableStream object as argument]
|
||||
expected: FAIL
|
||||
|
||||
[Constructing a ReadableStreamDefaultReader directly should be OK if the stream is closed]
|
||||
expected: FAIL
|
||||
|
||||
[Constructing a ReadableStreamDefaultReader directly should fail if the stream is already locked (via direct construction)]
|
||||
expected: FAIL
|
||||
|
||||
[getReader() should call ToString() on mode]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[default-reader.any.sharedworker.html]
|
||||
expected: ERROR
|
||||
|
@ -8,3 +32,27 @@
|
|||
|
||||
[default-reader.any.html]
|
||||
expected: ERROR
|
||||
[Getting a ReadableStreamDefaultReader via getReader should fail if the stream is already locked (via direct construction)]
|
||||
expected: FAIL
|
||||
|
||||
[Constructing a ReadableStreamDefaultReader directly should be OK if the stream is errored]
|
||||
expected: FAIL
|
||||
|
||||
[Constructing a ReadableStreamDefaultReader directly should fail if the stream is already locked (via getReader)]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStreamDefaultReader closed should always return the same promise object]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStreamDefaultReader constructor should get a ReadableStream object as argument]
|
||||
expected: FAIL
|
||||
|
||||
[Constructing a ReadableStreamDefaultReader directly should be OK if the stream is closed]
|
||||
expected: FAIL
|
||||
|
||||
[Constructing a ReadableStreamDefaultReader directly should fail if the stream is already locked (via direct construction)]
|
||||
expected: FAIL
|
||||
|
||||
[getReader() should call ToString() on mode]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -8,8 +8,20 @@
|
|||
[ReadableStream instances should have the correct list of properties]
|
||||
expected: FAIL
|
||||
|
||||
[default ReadableStream getReader() should only accept mode:undefined]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStream can't be constructed with an invalid type]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[general.any.worker.html]
|
||||
[ReadableStream instances should have the correct list of properties]
|
||||
expected: FAIL
|
||||
|
||||
[default ReadableStream getReader() should only accept mode:undefined]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStream can't be constructed with an invalid type]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -11,6 +11,9 @@
|
|||
[pipeTo() should not call Promise.prototype.then()]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStream async iterator should use the original values of getReader() and ReadableStreamDefaultReader methods]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[patched-global.any.worker.html]
|
||||
[ReadableStream getIterator() should use the original values of getReader() and ReadableStreamDefaultReader methods]
|
||||
|
@ -19,3 +22,6 @@
|
|||
[pipeTo() should not call Promise.prototype.then()]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStream async iterator should use the original values of getReader() and ReadableStreamDefaultReader methods]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -8,8 +8,14 @@
|
|||
[ReadableStream (empty): instances have the correct methods and properties]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStream (empty): calling getReader with invalid arguments should throw appropriate errors]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[templated.any.worker.html]
|
||||
[ReadableStream (empty): instances have the correct methods and properties]
|
||||
expected: FAIL
|
||||
|
||||
[ReadableStream (empty): calling getReader with invalid arguments should throw appropriate errors]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
[realtimeanalyser-fft-scaling.html]
|
||||
expected: TIMEOUT
|
||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
[018.html]
|
||||
expected: TIMEOUT
|
||||
[origin of the script that invoked the method, javascript:]
|
||||
expected: TIMEOUT
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
[Worker-constructor.html]
|
||||
expected: ERROR
|
|
@ -1,6 +1,5 @@
|
|||
[003.html]
|
||||
type: testharness
|
||||
expected: ERROR
|
||||
[shared]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
[shared-worker-in-data-url-context.window.html]
|
||||
expected: TIMEOUT
|
||||
[Create a shared worker in a data url frame]
|
||||
expected: FAIL
|
||||
|
||||
[Create a data url shared worker in a data url frame]
|
||||
expected: TIMEOUT
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
def main(request, response):
|
||||
return ([("Content-Type", "text/html")],
|
||||
"FROM_NETWORK")
|
||||
return ([(b"Content-Type", b"text/html")],
|
||||
u"FROM_NETWORK")
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import json
|
||||
|
||||
RESPONSE = """
|
||||
RESPONSE = u"""
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
|
@ -34,7 +34,7 @@ RESPONSE = """
|
|||
# embedder whether the data deletion succeeded.
|
||||
def main(request, response):
|
||||
types = [key for key in request.GET.keys()]
|
||||
header = ",".join("\"" + type + "\"" for type in types)
|
||||
return ([("Clear-Site-Data", header),
|
||||
("Content-Type", "text/html")],
|
||||
header = b",".join(b"\"" + type + b"\"" for type in types)
|
||||
return ([(b"Clear-Site-Data", header),
|
||||
(b"Content-Type", b"text/html")],
|
||||
RESPONSE)
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>CSS Test reference</title>
|
||||
<style>
|
||||
@font-face {
|
||||
font-family: Libertine;
|
||||
src: url(support/fonts/LinLibertine_Re-4.7.5.woff);
|
||||
}
|
||||
body {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
div {
|
||||
margin: 1em;
|
||||
font: 32px Libertine;
|
||||
}
|
||||
.ref {
|
||||
font-feature-settings: "liga" 0;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<p>Test passes if the "fi" below does NOT form a ligature:
|
||||
<div class=ref>fi</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,31 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>CSS Test: font-language-override</title>
|
||||
<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"/>
|
||||
<link rel="help" href="https://drafts.csswg.org/css-fonts/#font-language-override-prop"/>
|
||||
<link rel="match" href="font-language-override-01-ref.html"/>
|
||||
<meta name="assert" content="the specified OpenType language system should be used"/>
|
||||
<style>
|
||||
@font-face {
|
||||
font-family: Libertine;
|
||||
src: url(support/fonts/LinLibertine_Re-4.7.5.woff);
|
||||
}
|
||||
body {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
div {
|
||||
margin: 1em;
|
||||
font: 32px Libertine;
|
||||
}
|
||||
.test {
|
||||
font-language-override: "TRK";
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<p>Test passes if the "fi" below does NOT form a ligature:
|
||||
<div class=test>fi</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,27 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>CSS Test reference</title>
|
||||
<style>
|
||||
@font-face {
|
||||
font-family: Libertine;
|
||||
src: url(support/fonts/LinLibertine_Re-4.7.5.woff);
|
||||
}
|
||||
body {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
div {
|
||||
margin: 1em;
|
||||
font: 32px Libertine;
|
||||
}
|
||||
.notref {
|
||||
font-feature-settings: "liga" 0;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<p>Test passes if the "fi" below DOES form a ligature:
|
||||
<div class=notref>fi</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,27 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>CSS Test reference</title>
|
||||
<style>
|
||||
@font-face {
|
||||
font-family: Libertine;
|
||||
src: url(support/fonts/LinLibertine_Re-4.7.5.woff);
|
||||
}
|
||||
body {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
div {
|
||||
margin: 1em;
|
||||
font: 32px Libertine;
|
||||
}
|
||||
.ref {
|
||||
font-feature-settings: "liga" 1;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<p>Test passes if the "fi" below DOES form a ligature:
|
||||
<div class=ref>fi</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,32 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html lang="tr">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>CSS Test: font-language-override</title>
|
||||
<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"/>
|
||||
<link rel="help" href="https://drafts.csswg.org/css-fonts/#font-language-override-prop"/>
|
||||
<link rel="match" href="font-language-override-02-ref.html"/>
|
||||
<link rel="mismatch" href="font-language-override-02-notref.html"/>
|
||||
<meta name="assert" content="the specified OpenType language system should be used"/>
|
||||
<style>
|
||||
@font-face {
|
||||
font-family: Libertine;
|
||||
src: url(support/fonts/LinLibertine_Re-4.7.5.woff);
|
||||
}
|
||||
body {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
div {
|
||||
margin: 1em;
|
||||
font: 32px Libertine;
|
||||
}
|
||||
.test {
|
||||
font-language-override: "DEU";
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<p>Test passes if the "fi" below DOES form a ligature:
|
||||
<div class=test>fi</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,31 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>CSS Test: font-language-override</title>
|
||||
<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"/>
|
||||
<link rel="help" href="https://drafts.csswg.org/css-fonts/#font-language-override-prop"/>
|
||||
<link rel="match" href="font-language-override-02-ref.html"/>
|
||||
<meta name="assert" content="the specified OpenType language system should be used"/>
|
||||
<style>
|
||||
@font-face {
|
||||
font-family: Libertine;
|
||||
src: url(support/fonts/LinLibertine_Re-4.7.5.woff);
|
||||
}
|
||||
body {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
div {
|
||||
margin: 1em;
|
||||
font: 32px Libertine;
|
||||
}
|
||||
.test {
|
||||
font-language-override: "trk"; /* NOT the tag for Turkish */
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<p>Test passes if the "fi" below DOES form a ligature:
|
||||
<div class=test>fi</div>
|
||||
</body>
|
||||
</html>
|
|
@ -51,6 +51,8 @@
|
|||
@property --initial-value-only {
|
||||
initial-value: red;
|
||||
}
|
||||
/* U+0009 CHARACTER TABULATION */
|
||||
@property --tab\9 tab { }
|
||||
</style>
|
||||
<script>
|
||||
|
||||
|
@ -119,6 +121,7 @@ test_css_text('--no-initial-value', '@property --no-initial-value { syntax: "<co
|
|||
test_css_text('--syntax-only', '@property --syntax-only { syntax: "<color> | none"; }');
|
||||
test_css_text('--inherits-only', '@property --inherits-only { inherits: true; }');
|
||||
test_css_text('--initial-value-only', '@property --initial-value-only { initial-value: red; }');
|
||||
test_css_text('--tab\ttab', '@property --tab\\9 tab { }');
|
||||
|
||||
// CSSRule.type
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
<meta content="This test checks that an SVG application with a text following a text path can be selected and then be styled." name="assert">
|
||||
|
||||
<style>
|
||||
::selected
|
||||
::selection
|
||||
{
|
||||
fill: green;
|
||||
/*
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
def main(request, response):
|
||||
response.headers.set("Content-Type", "text/plain")
|
||||
response.headers.set("Refresh", "0;./refreshed.txt?\x80\xFF") # Test byte to Unicode conversion
|
||||
response.content = "Not refreshed.\n"
|
||||
response.headers.set(b"Content-Type", b"text/plain")
|
||||
response.headers.set(b"Refresh", b"0;./refreshed.txt?\x80\xFF") # Test byte to Unicode conversion
|
||||
response.content = u"Not refreshed.\n"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
def main(request, response):
|
||||
location = request.GET.first("location")
|
||||
location = request.GET.first(b"location")
|
||||
response.status = 302
|
||||
response.headers.set("Location", location)
|
||||
response.headers.set(b"Location", location)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
def main(request, response):
|
||||
headers = [("Content-Type", "text/html")]
|
||||
return headers, '''
|
||||
headers = [(b"Content-Type", b"text/html")]
|
||||
return headers, u'''
|
||||
<script>
|
||||
onload = function() {opener.next()}
|
||||
document.write(Math.random());
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
def main(request, response):
|
||||
type = request.GET['type']
|
||||
if request.GET['type'] == 'fallingback':
|
||||
return 404, [('Content-Type', 'text/plain')], "Page not found"
|
||||
return [('Content-Type', 'text/plain')], type
|
||||
type = request.GET[b'type']
|
||||
if request.GET[b'type'] == b'fallingback':
|
||||
return 404, [(b'Content-Type', b'text/plain')], u"Page not found"
|
||||
return [(b'Content-Type', b'text/plain')], type
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
script = '''
|
||||
script = b'''
|
||||
<script>
|
||||
function fetchCachedFileTest() {
|
||||
return fetch('appcache-data.py?type=cached')
|
||||
|
@ -37,7 +37,7 @@ fetchCachedFileTest()
|
|||
'''
|
||||
|
||||
def main(request, response):
|
||||
type = request.GET['type']
|
||||
if request.GET['type'] == 'fallingback':
|
||||
return 404, [('Content-Type', 'text/plain')], "Page not found"
|
||||
return [('Content-Type', 'text/html')], script % type
|
||||
type = request.GET[b'type']
|
||||
if request.GET[b'type'] == b'fallingback':
|
||||
return 404, [(b'Content-Type', b'text/plain')], u"Page not found"
|
||||
return [(b'Content-Type', b'text/html')], script % type
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
def main(request, response):
|
||||
type = request.GET['type']
|
||||
if request.GET['type'] == 'fallingback':
|
||||
return 404, [('Content-Type', 'text/plain')], "Page not found"
|
||||
return [('Content-Type', 'text/plain')], type
|
||||
type = request.GET[b'type']
|
||||
if request.GET[b'type'] == b'fallingback':
|
||||
return 404, [(b'Content-Type', b'text/plain')], u"Page not found"
|
||||
return [(b'Content-Type', b'text/plain')], type
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
script = 'info = \'Set by the %s script\';'
|
||||
script = b'info = \'Set by the %s script\';'
|
||||
|
||||
def main(request, response):
|
||||
type = request.GET['type']
|
||||
if request.GET['type'] == 'fallingback':
|
||||
return 404, [('Content-Type', 'text/plain')], "Page not found"
|
||||
return [('Content-Type', 'text/javascript')], script % type
|
||||
type = request.GET[b'type']
|
||||
if request.GET[b'type'] == b'fallingback':
|
||||
return 404, [(b'Content-Type', b'text/plain')], u"Page not found"
|
||||
return [(b'Content-Type', b'text/javascript')], script % type
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
script = '''
|
||||
script = b'''
|
||||
var initPromise = Promise.resolve();
|
||||
|
||||
if ('SharedWorkerGlobalScope' in self &&
|
||||
|
@ -97,7 +97,7 @@ initPromise
|
|||
'''
|
||||
|
||||
def main(request, response):
|
||||
type = request.GET['type']
|
||||
if request.GET['type'] == 'fallingback':
|
||||
return 404, [('Content-Type', 'text/plain')], "Page not found"
|
||||
return [('Content-Type', 'text/javascript')], script % type
|
||||
type = request.GET[b'type']
|
||||
if request.GET[b'type'] == b'fallingback':
|
||||
return 404, [(b'Content-Type', b'text/plain')], u"Page not found"
|
||||
return [(b'Content-Type', b'text/javascript')], script % type
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
<title>Cross-Origin-Opener-Policy: a navigated popup with reporting</title>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<script src="/common/utils.js"></script> <!-- Use token() to allow running tests in parallel -->
|
||||
<script src="resources/reporting-common.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
// This test does the following:
|
||||
// 1 - This document has COOP: same-origin-allow-popups; report-to="coop-report-endpoint"
|
||||
// 2 - Open a popup on a same-origin page without COOP, with the coop-popup-report-endpoint
|
||||
// 3 - Navigate the popup to a same-origin page with COOP, with the coop-redirect-report-endpoint
|
||||
// it verifies that the reports are properly send for the browsing context switch
|
||||
// during the navigation in the popup (step 3). The current document (the opener)
|
||||
// endpoint should not receive any report as no switch ocurred on 2.
|
||||
promise_test( async t => {
|
||||
const popupName = token();
|
||||
const noCoopChannelName = token();
|
||||
const coopChannelName = token();
|
||||
await reportingTest( (resolve) => {
|
||||
const noCOOP = `resources/coop-coep.py?coop=${encodeURIComponent(`unsafe-none; report-to="${popupReportEndpoint.name}"`)}&coep=&channel=${noCoopChannelName}`;
|
||||
const coop = `resources/coop-coep.py?coop=${encodeURIComponent(`same-origin; report-to="${redirectReportEndpoint.name}"`)}&coep=&channel=${coopChannelName}`;
|
||||
|
||||
const popup = window.open(noCOOP, popupName);
|
||||
const channel = new BroadcastChannel(coopChannelName);
|
||||
// Close the popup once the test is complete.
|
||||
// The browsing context is closed after the navigation hence use the
|
||||
// broadcast channel to trigger the closure.
|
||||
t.add_cleanup(() => {
|
||||
channel.postMessage("close");
|
||||
});
|
||||
popup.onload = t.step_func(() => {
|
||||
assert_equals(popup.name.length, popupName.length, "popup name");
|
||||
channel.onmessage = t.step_func(event => {
|
||||
const payload = event.data;
|
||||
// The name should be empty, but we're checking the length rather than a
|
||||
// string comparison to "" to keep the random token out of error messages.
|
||||
assert_equals(payload.name.length, 0, "Popup name after navigation");
|
||||
assert_false(payload.opener, "Opener after navigation");
|
||||
assert_true(popup.closed, "Window proxy closed after navigation");
|
||||
resolve();
|
||||
});
|
||||
popup.location = coop;
|
||||
});
|
||||
},
|
||||
popupName,
|
||||
[
|
||||
// Reports expected for the navigation from "noCOOP" to "coop"
|
||||
{
|
||||
"endpoint": popupReportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": RegExp(`coop-coep.py?.*channel=${noCoopChannelName}$`),
|
||||
"effective-policy": "unsafe-none",
|
||||
"navigation-uri": RegExp(`coop-coep.py?.*channel=${coopChannelName}$`),
|
||||
"violation-type": "navigation-from-document"
|
||||
},
|
||||
"url": RegExp(`coop-coep.py?.*channel=${noCoopChannelName}$`),
|
||||
"type": "coop"
|
||||
}
|
||||
},
|
||||
{
|
||||
"endpoint": redirectReportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": RegExp(`coop-coep.py?.*channel=${coopChannelName}$`),
|
||||
"effective-policy": "same-origin",
|
||||
"navigation-uri": RegExp(`coop-coep.py?.*channel=${noCoopChannelName}$`),
|
||||
"violation-type": "navigation-to-document"
|
||||
},
|
||||
"url": RegExp(`coop-coep.py?.*channel=${coopChannelName}$`),
|
||||
"type": "coop"
|
||||
}
|
||||
},
|
||||
]);
|
||||
}, "Open a popup to a document without COOP, then navigate it to a document with");
|
||||
|
||||
verifyRemainingReports();
|
||||
|
||||
</script>
|
|
@ -0,0 +1,2 @@
|
|||
Cross-Origin-Opener-Policy: same-origin-allow-popups; report-to="coop-report-endpoint"
|
||||
report-to: { "group": "coop-report-endpoint", "max_age": 10886400, "endpoints": [{ "url": "https://{{hosts[][www]}}:{{ports[https][0]}}/html/cross-origin-opener-policy/resources/report.py?endpoint=coop-report-endpoint" }] }, { "group": "coop-report-only-endpoint", "max_age": 10886400, "endpoints": [{ "url": "https://{{hosts[][www]}}:{{ports[https][0]}}/html/cross-origin-opener-policy/resources/report.py?endpoint=coop-report-only-endpoint" }]}
|
|
@ -0,0 +1,123 @@
|
|||
<meta name=timeout content=long>
|
||||
<title>reporting same origin with report-to</title>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<script src="/common/get-host-info.sub.js"></script>
|
||||
<script src="resources/common.js"></script>
|
||||
<script src="resources/reporting-common.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
let tests = [
|
||||
// popup origin, popup COOP, popup COEP, expected opener, expected reports
|
||||
|
||||
// Open a same-origin popup with a same-origin COOP and no COEP. Produces two
|
||||
// reports (one from and one to). Both pages being same origin, the
|
||||
// next/pervious document urls are available.
|
||||
[
|
||||
SAME_ORIGIN,
|
||||
`same-origin; report-to="${popupReportEndpoint.name}"`,
|
||||
"",
|
||||
false,
|
||||
[
|
||||
{
|
||||
"endpoint": reportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": `${location.href}`,
|
||||
"effective-policy": "same-origin-allow-popups",
|
||||
"navigation-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/, // next document URL
|
||||
"violation-type": "navigation-from-document"
|
||||
},
|
||||
"url": `${location.href}`,
|
||||
"type": "coop"
|
||||
}
|
||||
},
|
||||
{
|
||||
"endpoint": popupReportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"effective-policy": "same-origin",
|
||||
"navigation-uri": `${location.href}`, // previous documnent url
|
||||
"violation-type": "navigation-to-document"
|
||||
},
|
||||
"url": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"type": "coop"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
// Open a cross-origin popup with a same-origin-allow-popup COOP and noCOEP.
|
||||
// Produces two reports (one from and one to). Both pages being cross origin,
|
||||
// the next/pervious document urls are not available and the initial document
|
||||
// url/referrer are used instead.
|
||||
[
|
||||
CROSS_ORIGIN,
|
||||
`same-origin-allow-popups; report-to="${popupReportEndpoint.name}"`,
|
||||
"require-corp",
|
||||
false,
|
||||
[
|
||||
{
|
||||
"endpoint": reportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": `${location.href}`,
|
||||
"effective-policy": "same-origin-allow-popups",
|
||||
"navigation-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/, // initial navigation URL
|
||||
"violation-type": "navigation-from-document"
|
||||
},
|
||||
"url": `${location.href}`,
|
||||
"type": "coop"
|
||||
}
|
||||
},
|
||||
{
|
||||
"endpoint": popupReportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"effective-policy": "same-origin-allow-popups",
|
||||
"navigation-uri": `${location.origin}/`, // referrer (origin, as dictated by the referrer policy)
|
||||
"violation-type": "navigation-to-document"
|
||||
},
|
||||
"url": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"type": "coop"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
// Open a cross-origin popup with a same-origin COOP and COEP, and no reporting.
|
||||
// Produces one navigation-from-report for this document (the opener). The
|
||||
// pages being cross origin, the next/pervious document urls are not available
|
||||
// and the initial document url/referrer are used instead.
|
||||
[
|
||||
CROSS_ORIGIN,
|
||||
`same-origin`,
|
||||
"require-corp",
|
||||
false,
|
||||
[
|
||||
{
|
||||
"endpoint": reportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": `${location.href}`,
|
||||
"effective-policy": "same-origin-allow-popups",
|
||||
"navigation-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/, // initial navigation URL
|
||||
"violation-type": "navigation-from-document"
|
||||
},
|
||||
"url": `${location.href}`,
|
||||
"type": "coop"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
];
|
||||
|
||||
runCoopReportingTest(document.title, tests);
|
||||
|
||||
</script>
|
|
@ -0,0 +1,3 @@
|
|||
report-to: { "group": "coop-report-endpoint", "max_age": 10886400, "endpoints": [{ "url": "https://{{hosts[][www]}}:{{ports[https][0]}}/html/cross-origin-opener-policy/resources/report.py?endpoint=coop-report-endpoint" }] }, { "group": "coop-report-only-endpoint", "max_age": 10886400, "endpoints": [{ "url": "https://{{hosts[][www]}}:{{ports[https][0]}}/html/cross-origin-opener-policy/resources/report.py?endpoint=coop-report-only-endpoint" }]}
|
||||
Cross-Origin-Opener-Policy: same-origin-allow-popups; report-to="coop-report-endpoint"
|
||||
Referrer-Policy: origin
|
|
@ -0,0 +1,108 @@
|
|||
<meta name=timeout content=long>
|
||||
<title>reporting same origin with report-to</title>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<script src="/common/get-host-info.sub.js"></script>
|
||||
<script src="resources/common.js"></script>
|
||||
<script src="resources/reporting-common.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
let tests = [
|
||||
// popup origin, popup COOP, popup COEP, expected opener, expected reports
|
||||
|
||||
// Open and navigate a popup to a same-origin page with the same COOP-COEP
|
||||
// settings: no browsing context group switch hence no report expected.
|
||||
[
|
||||
SAME_ORIGIN,
|
||||
`same-origin; report-to="${popupReportEndpoint.name}"`,
|
||||
"require-corp",
|
||||
true,
|
||||
[]
|
||||
],
|
||||
// Open a same-origin popup with a same-origin COOP but no COEP. Produces two
|
||||
// reports (one from and one to). The from report has an effective-policy of
|
||||
// same-origin-plus-coep, both pages being same origin, the entire
|
||||
// next/pervious document urls are available.
|
||||
[
|
||||
SAME_ORIGIN,
|
||||
`same-origin; report-to="${popupReportEndpoint.name}"`,
|
||||
"",
|
||||
false,
|
||||
[
|
||||
{
|
||||
"endpoint": reportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": `${location.href}`,
|
||||
"effective-policy": "same-origin-plus-coep",
|
||||
"navigation-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/, // next destination url
|
||||
"violation-type": "navigation-from-document"
|
||||
},
|
||||
"url": `${location.href}`,
|
||||
"type": "coop"
|
||||
}
|
||||
},
|
||||
{
|
||||
"endpoint": popupReportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"effective-policy": "same-origin",
|
||||
"navigation-uri": `${location.href}`, // previous document url
|
||||
"violation-type": "navigation-to-document"
|
||||
},
|
||||
"url": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"type": "coop"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
// Open a cross-origin popup with a same-origin COOP and COEP. Produces two
|
||||
// reports (one from and one to). The from report has an effective-policy of
|
||||
// same-origin-plus-coep, both pages being cross origin, the next/pervious
|
||||
// document urls are not available and the initial document url/referrer are
|
||||
// used instead.
|
||||
[
|
||||
CROSS_ORIGIN,
|
||||
`same-origin; report-to="${popupReportEndpoint.name}"`,
|
||||
"require-corp",
|
||||
false,
|
||||
[
|
||||
{
|
||||
"endpoint": reportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": `${location.href}`,
|
||||
"effective-policy": "same-origin-plus-coep",
|
||||
"navigation-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/, // initial navigation url
|
||||
"violation-type": "navigation-from-document"
|
||||
},
|
||||
"url": `${location.href}`,
|
||||
"type": "coop"
|
||||
}
|
||||
},
|
||||
{
|
||||
"endpoint": popupReportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"effective-policy": "same-origin-plus-coep",
|
||||
"navigation-uri": `${location.origin}/`, // referrer (origin, as dictated by the referrer policy)
|
||||
"violation-type": "navigation-to-document"
|
||||
},
|
||||
"url": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"type": "coop"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
];
|
||||
|
||||
runCoopReportingTest(document.title, tests);
|
||||
|
||||
</script>
|
|
@ -0,0 +1,4 @@
|
|||
report-to: { "group": "coop-report-endpoint", "max_age": 10886400, "endpoints": [{ "url": "https://{{hosts[][www]}}:{{ports[https][0]}}/html/cross-origin-opener-policy/resources/report.py?endpoint=coop-report-endpoint" }] }, { "group": "coop-report-only-endpoint", "max_age": 10886400, "endpoints": [{ "url": "https://{{hosts[][www]}}:{{ports[https][0]}}/html/cross-origin-opener-policy/resources/report.py?endpoint=coop-report-only-endpoint" }]}
|
||||
Cross-Origin-Opener-Policy: same-origin; report-to="coop-report-endpoint"
|
||||
Cross-Origin-Embedder-Policy: require-corp
|
||||
Referrer-Policy: origin
|
|
@ -0,0 +1,213 @@
|
|||
<meta name=timeout content=long>
|
||||
<title>reporting same origin with report-to</title>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<script src="/common/get-host-info.sub.js"></script>
|
||||
<script src="resources/common.js"></script>
|
||||
<script src="resources/reporting-common.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
let tests = [
|
||||
// popup origin, popup COOP, popup COEP, expected opener, expected reports
|
||||
|
||||
// Open a popup on a same-origin page, with a compatible COOP.
|
||||
// This is a sanity check that no report are produced.
|
||||
[
|
||||
SAME_ORIGIN,
|
||||
`same-origin; report-to="${popupReportEndpoint.name}"`,
|
||||
"",
|
||||
true,
|
||||
[]
|
||||
],
|
||||
// Open a cross-origin popup with a same-origin COOP. Produces two
|
||||
// reports (one from and one to). The from report has an effective-policy of
|
||||
// same-origin (corresponding to the current document), both pages being
|
||||
// cross origin, the next/pervious document urls are not available and the
|
||||
// initial document url/referrer are used instead.
|
||||
[
|
||||
CROSS_ORIGIN,
|
||||
`same-origin; report-to="${popupReportEndpoint.name}"`,
|
||||
"",
|
||||
false,
|
||||
[
|
||||
{
|
||||
"endpoint": reportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": `${location.href}`,
|
||||
"effective-policy": "same-origin",
|
||||
"navigation-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/, // initial navigation URL (equal to the next document url in that case)
|
||||
"violation-type": "navigation-from-document"
|
||||
},
|
||||
"url": `${location.href}`,
|
||||
"type": "coop"
|
||||
}
|
||||
},
|
||||
{
|
||||
"endpoint": popupReportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"effective-policy": "same-origin",
|
||||
"navigation-uri": '', // referrer (empty due to the Referrer Policy)
|
||||
"violation-type": "navigation-to-document"
|
||||
},
|
||||
"url": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"type": "coop"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
// Open a same-origin popup with a unsafe-none COOP and no COEP. COOP switches
|
||||
// the browsing context group and hence produces two reports (one from and one
|
||||
// to). This test verifies that unsafe-none properly sends report.
|
||||
[
|
||||
SAME_ORIGIN,
|
||||
`unsafe-none; report-to="${popupReportEndpoint.name}"`,
|
||||
"",
|
||||
false,
|
||||
[
|
||||
{
|
||||
"endpoint": reportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": `${location.href}`,
|
||||
"effective-policy": "same-origin",
|
||||
"navigation-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"violation-type": "navigation-from-document"
|
||||
},
|
||||
"url": `${location.href}`,
|
||||
"type": "coop"
|
||||
}
|
||||
},
|
||||
{
|
||||
"endpoint": popupReportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"effective-policy": "unsafe-none",
|
||||
"navigation-uri": `${location.href}`,
|
||||
"violation-type": "navigation-to-document"
|
||||
},
|
||||
"url": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"type": "coop"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
// Open a same-origin popup with a same-origin COOP and COEP. The difference
|
||||
// of COEP values leads to the browsing context group switch and produces two
|
||||
// reports. This verifies that the navigation-to-document report has an
|
||||
// effective-policy of same-origin-plus-coep.
|
||||
[
|
||||
SAME_ORIGIN,
|
||||
`same-origin; report-to="${popupReportEndpoint.name}"`,
|
||||
"require-corp",
|
||||
false,
|
||||
[
|
||||
{
|
||||
"endpoint": reportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": `${location.href}`,
|
||||
"effective-policy": "same-origin",
|
||||
"navigation-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/, // Next document URL
|
||||
"violation-type": "navigation-from-document"
|
||||
},
|
||||
"url": `${location.href}`,
|
||||
"type": "coop"
|
||||
}
|
||||
},
|
||||
{
|
||||
"endpoint": popupReportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"effective-policy": "same-origin-plus-coep",
|
||||
"navigation-uri": `${location.href}`, // Previous document URL
|
||||
"violation-type": "navigation-to-document"
|
||||
},
|
||||
"url": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"type": "coop"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
// Open a cross-origin popup with no COOP (but reporting) and no COEP.
|
||||
// Produces two reports. The pages being cross origin, the next/pervious
|
||||
// document urls are not available and the initial document url/referrer are
|
||||
// used instead.
|
||||
[
|
||||
CROSS_ORIGIN,
|
||||
`unsafe-none; report-to="${popupReportEndpoint.name}"`,
|
||||
"",
|
||||
false,
|
||||
[
|
||||
{
|
||||
"endpoint": reportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": `${location.href}`,
|
||||
"effective-policy": "same-origin",
|
||||
"navigation-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/, // initial navigation URL
|
||||
"violation-type": "navigation-from-document"
|
||||
},
|
||||
"url": `${location.href}`,
|
||||
"type": "coop"
|
||||
}
|
||||
},
|
||||
{
|
||||
"endpoint": popupReportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"effective-policy": "unsafe-none",
|
||||
"navigation-uri": '', // referrer, as per the no-referrer policy.
|
||||
"violation-type": "navigation-to-document"
|
||||
},
|
||||
"url": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"type": "coop"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
// Open a same-origin popup with no COOP (without reporting) and no COEP.
|
||||
// Produces one report to this page (opener) endpoint.
|
||||
// This verifies that the navigated-to-document's COOP report values do not
|
||||
// impact the navigated-from-document's COOP.
|
||||
[
|
||||
SAME_ORIGIN,
|
||||
"unsafe-none",
|
||||
"",
|
||||
false,
|
||||
[
|
||||
{
|
||||
"endpoint": reportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": `${location.href}`,
|
||||
"effective-policy": "same-origin",
|
||||
"navigation-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"violation-type": "navigation-from-document"
|
||||
},
|
||||
"url": `${location.href}`,
|
||||
"type": "coop"
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
];
|
||||
|
||||
runCoopReportingTest(document.title, tests);
|
||||
|
||||
</script>
|
|
@ -0,0 +1,3 @@
|
|||
report-to: { "group": "coop-report-endpoint", "max_age": 10886400, "endpoints": [{ "url": "https://{{hosts[][www]}}:{{ports[https][0]}}/html/cross-origin-opener-policy/resources/report.py?endpoint=coop-report-endpoint" }] }, { "group": "coop-report-only-endpoint", "max_age": 10886400, "endpoints": [{ "url": "https://{{hosts[][www]}}:{{ports[https][0]}}/html/cross-origin-opener-policy/resources/report.py?endpoint=coop-report-only-endpoint" }]}
|
||||
Cross-Origin-Opener-Policy: same-origin; report-to="coop-report-endpoint"
|
||||
Referrer-Policy: no-referrer
|
|
@ -0,0 +1,96 @@
|
|||
<meta name=timeout content=long>
|
||||
<title>reporting same origin</title>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<script src="/common/get-host-info.sub.js"></script>
|
||||
<script src="resources/common.js"></script>
|
||||
<script src="resources/reporting-common.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
let tests = [
|
||||
// popup origin, popup COOP, popup COEP, expected opener, expected reports
|
||||
|
||||
// Open a cross-origin popup with a same-origin COOP and no COEP. COOP
|
||||
// switches the browsing context group and hence produces one report.
|
||||
// This test verifies that the navigated to document properly sends a
|
||||
// navigation-to report. The navigation-uri is the referrer.
|
||||
[
|
||||
CROSS_ORIGIN,
|
||||
`same-origin; report-to="${popupReportEndpoint.name}"`,
|
||||
"",
|
||||
false,
|
||||
[
|
||||
{
|
||||
"endpoint": popupReportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"effective-policy": "same-origin",
|
||||
"navigation-uri": `${location.href}`, // referrer
|
||||
"violation-type": "navigation-to-document"
|
||||
},
|
||||
"url": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"type": "coop"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
// Open a same-origin popup with a unsafe-none COOP and no COEP. COOP switches
|
||||
// the browsing context group and hence produces one report.
|
||||
// This test verifies that having different policies on same origin documents
|
||||
// still properly produces report to the navigated-to-document.
|
||||
[
|
||||
SAME_ORIGIN,
|
||||
`unsafe-none; report-to="${popupReportEndpoint.name}"`,
|
||||
"",
|
||||
false,
|
||||
[
|
||||
{
|
||||
"endpoint": popupReportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"effective-policy": "unsafe-none",
|
||||
"navigation-uri": `${location.href}`,
|
||||
"violation-type": "navigation-to-document"
|
||||
},
|
||||
"url": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"type": "coop"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
// Open a cross-origin popup with a unsafe-none COOP (with reporting) and no
|
||||
// COEP. COOP switches the browsing context group and hence produces one
|
||||
// reports to the unsafe-none document. This test verifies that unsafe-none
|
||||
// properly sends report in that configuration.
|
||||
[
|
||||
CROSS_ORIGIN,
|
||||
`unsafe-none; report-to="${popupReportEndpoint.name}"`,
|
||||
"",
|
||||
false,
|
||||
[
|
||||
{
|
||||
"endpoint": popupReportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"effective-policy": "unsafe-none",
|
||||
"navigation-uri": `${location.href}`, // referrer
|
||||
"violation-type": "navigation-to-document"
|
||||
},
|
||||
"url": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"type": "coop"
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
];
|
||||
|
||||
runCoopReportingTest(document.title, tests);
|
||||
|
||||
</script>
|
|
@ -0,0 +1 @@
|
|||
Cross-Origin-Opener-Policy: same-origin
|
|
@ -0,0 +1,123 @@
|
|||
<meta name=timeout content=long>
|
||||
<title>reporting same origin with report-to</title>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<script src="/common/get-host-info.sub.js"></script>
|
||||
<script src="resources/common.js"></script>
|
||||
<script src="resources/reporting-common.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
let tests = [
|
||||
// popup origin, popup COOP, popup COEP, expected opener, expected reports
|
||||
|
||||
// Open a same-origin popup with a same-origin COOP with reporting and no COEP.
|
||||
// COOP switches the browsing context group and hence produces two reports
|
||||
// (one from and one to). This test verifies that unsafe-none (from the opener)
|
||||
// properly sends a report.
|
||||
[
|
||||
SAME_ORIGIN,
|
||||
`same-origin; report-to="${popupReportEndpoint.name}"`,
|
||||
"",
|
||||
false,
|
||||
[
|
||||
{
|
||||
"endpoint": reportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": `${location.href}`,
|
||||
"effective-policy": "unsafe-none",
|
||||
"navigation-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/, // next document URL
|
||||
"violation-type": "navigation-from-document"
|
||||
},
|
||||
"url": `${location.href}`,
|
||||
"type": "coop"
|
||||
}
|
||||
},
|
||||
{
|
||||
"endpoint": popupReportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"effective-policy": "same-origin",
|
||||
"navigation-uri": `${location.href}`, // previous document url
|
||||
"violation-type": "navigation-to-document"
|
||||
},
|
||||
"url": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"type": "coop"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
// Open a same-origin popup with a same-origin COOP (no reporting)and no COEP.
|
||||
// COOP switches the browsing context group and hence produces one report for
|
||||
// the navigated from document (this page, the opener). This test differs with
|
||||
// the previous one as it assert that the navigated to document's COOP reporting
|
||||
// values do not interfere.
|
||||
[
|
||||
SAME_ORIGIN,
|
||||
`same-origin`,
|
||||
"",
|
||||
false,
|
||||
[
|
||||
{
|
||||
"endpoint": reportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": `${location.href}`,
|
||||
"effective-policy": "unsafe-none",
|
||||
"navigation-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/, // next document URL
|
||||
"violation-type": "navigation-from-document"
|
||||
},
|
||||
"url": `${location.href}`,
|
||||
"type": "coop"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
// Open a cross-origin popup with a same-origin COOP and no COEP. COOP switches
|
||||
// the browsing context group and hence produces two reports.
|
||||
[
|
||||
CROSS_ORIGIN,
|
||||
`same-origin; report-to="${popupReportEndpoint.name}"`,
|
||||
"",
|
||||
false,
|
||||
[
|
||||
{
|
||||
"endpoint": reportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": `${location.href}`,
|
||||
"effective-policy": "unsafe-none",
|
||||
"navigation-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/, // initial navigation url
|
||||
"violation-type": "navigation-from-document"
|
||||
},
|
||||
"url": `${location.href}`,
|
||||
"type": "coop"
|
||||
}
|
||||
},
|
||||
{
|
||||
"endpoint": popupReportEndpoint,
|
||||
"report": {
|
||||
"body": {
|
||||
"disposition": "enforce",
|
||||
"document-uri": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"effective-policy": "same-origin",
|
||||
"navigation-uri": `${location.href}`, // referrer
|
||||
"violation-type": "navigation-to-document"
|
||||
},
|
||||
"url": /coop-coep.py?.*channel=CHANNEL_NAME$/,
|
||||
"type": "coop"
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
];
|
||||
|
||||
runCoopReportingTest(document.title, tests);
|
||||
|
||||
</script>
|
|
@ -0,0 +1,2 @@
|
|||
report-to: { "group": "coop-report-endpoint", "max_age": 10886400, "endpoints": [{ "url": "https://{{hosts[][www]}}:{{ports[https][0]}}/html/cross-origin-opener-policy/resources/report.py?endpoint=coop-report-endpoint" }] }, { "group": "coop-report-only-endpoint", "max_age": 10886400, "endpoints": [{ "url": "https://{{hosts[][www]}}:{{ports[https][0]}}/html/cross-origin-opener-policy/resources/report.py?endpoint=coop-report-only-endpoint" }]}
|
||||
Cross-Origin-Opener-Policy: unsafe-none; report-to="coop-report-endpoint"
|
|
@ -29,11 +29,14 @@ function validate_results(callback, test, w, channelName, hasOpener, openerDOMAc
|
|||
}
|
||||
}
|
||||
|
||||
function url_test(t, url, channelName, hasOpener, openerDOMAccess) {
|
||||
function url_test(t, url, channelName, hasOpener, openerDOMAccess, callback) {
|
||||
if (callback === undefined) {
|
||||
callback = () => { t.done(); };
|
||||
}
|
||||
const bc = new BroadcastChannel(channelName);
|
||||
bc.onmessage = t.step_func(event => {
|
||||
const payload = event.data;
|
||||
validate_results(() => { t.done(); }, t, w, channelName, hasOpener, openerDOMAccess, payload);
|
||||
validate_results(callback, t, w, channelName, hasOpener, openerDOMAccess, payload);
|
||||
});
|
||||
|
||||
const w = window.open(url, channelName);
|
||||
|
@ -46,12 +49,12 @@ function url_test(t, url, channelName, hasOpener, openerDOMAccess) {
|
|||
});
|
||||
}
|
||||
|
||||
function coop_coep_test(t, host, coop, coep, channelName, hasOpener, openerDOMAccess) {
|
||||
url_test(t, `${host.origin}/html/cross-origin-opener-policy/resources/coop-coep.py?coop=${encodeURIComponent(coop)}&coep=${coep}&channel=${channelName}`, channelName, hasOpener, openerDOMAccess);
|
||||
function coop_coep_test(t, host, coop, coep, channelName, hasOpener, openerDOMAccess, callback) {
|
||||
url_test(t, `${host.origin}/html/cross-origin-opener-policy/resources/coop-coep.py?coop=${encodeURIComponent(coop)}&coep=${coep}&channel=${channelName}`, channelName, hasOpener, openerDOMAccess, callback);
|
||||
}
|
||||
|
||||
function coop_test(t, host, coop, channelName, hasOpener) {
|
||||
coop_coep_test(t, host, coop, "", channelName, hasOpener);
|
||||
function coop_test(t, host, coop, channelName, hasOpener, callback) {
|
||||
coop_coep_test(t, host, coop, "", channelName, hasOpener, undefined /* openerDOMAccess */, callback);
|
||||
}
|
||||
|
||||
function run_coop_tests(documentCOOPValueTitle, testArray) {
|
||||
|
@ -59,7 +62,7 @@ function run_coop_tests(documentCOOPValueTitle, testArray) {
|
|||
async_test(t => {
|
||||
coop_test(t, test[0], test[1],
|
||||
`${documentCOOPValueTitle}_to_${test[0].name}_${test[1].replace(/ /g,"-")}`,
|
||||
test[2]);
|
||||
test[2], () => { t.done(); });
|
||||
}, `${documentCOOPValueTitle} document opening popup to ${test[0].origin} with COOP: "${test[1]}"`);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,13 +1,42 @@
|
|||
def get_reporting_group(host, endpoint):
|
||||
return '\
|
||||
{{\
|
||||
"group": "{endpoint}",\
|
||||
"max_age": 10886400,\
|
||||
"endpoints":\
|
||||
[{{\
|
||||
"url": "https://{host}/html/cross-origin-opener-policy/resources/report.py?endpoint={endpoint}"\
|
||||
}}]\
|
||||
}}'.format(host=host, endpoint=endpoint)
|
||||
|
||||
def main(request, response):
|
||||
coop = request.GET.first("coop")
|
||||
coopReportOnly = request.GET.first("coop-report-only") if "coop-report-only" in request.GET else ""
|
||||
coep = request.GET.first("coep")
|
||||
coepReportOnly = request.GET.first("coep-report-only") if "coep-report-only" in request.GET else ""
|
||||
redirect = request.GET.first("redirect", None)
|
||||
if coop != "":
|
||||
response.headers.set("Cross-Origin-Opener-Policy", coop)
|
||||
if coop != "":
|
||||
response.headers.set("Cross-Origin-Opener-Policy-Report-Only", coopReportOnly)
|
||||
if coep != "":
|
||||
response.headers.set("Cross-Origin-Embedder-Policy", coep)
|
||||
if coep != "":
|
||||
response.headers.set("Cross-Origin-Embedder-Policy-Report-Only", coepReportOnly)
|
||||
if 'cache' in request.GET:
|
||||
response.headers.set('Cache-Control', 'max-age=3600')
|
||||
host = request.url_parts[1]
|
||||
|
||||
# add all possible reporting endpoints to the report-to header
|
||||
# Note that this also returns the coop-report-endpoint, as it may override
|
||||
# the test's endpoints if same-origin.
|
||||
response.headers.set('report-to',
|
||||
get_reporting_group(host, "coop-report-endpoint") + ',' +
|
||||
get_reporting_group(host, "coop-report-only-endpoint") + ',' +
|
||||
get_reporting_group(host, "coop-redirect-report-endpoint") + ',' +
|
||||
get_reporting_group(host, "coop-redirect-report-only-endpoint") + ',' +
|
||||
get_reporting_group(host, "coop-popup-report-endpoint") + ',' +
|
||||
get_reporting_group(host, "coop-popup-report-only-endpoint") )
|
||||
|
||||
if redirect != None:
|
||||
response.status = 302
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
import json, uuid
|
||||
|
||||
def main(request, response):
|
||||
response.headers.set('Cache-Control', 'no-cache, no-store, must-revalidate');
|
||||
|
||||
key = 0;
|
||||
if 'endpoint' in request.GET:
|
||||
key = uuid.uuid5(uuid.NAMESPACE_OID, request.GET['endpoint']).get_urn()
|
||||
|
||||
if key == 0:
|
||||
response.status = 400
|
||||
return 'invalid endpoint'
|
||||
|
||||
if request.method == 'POST':
|
||||
reports = request.server.stash.take(key) or []
|
||||
for report in json.loads(request.body):
|
||||
reports.append(report)
|
||||
request.server.stash.put(key, reports)
|
||||
return "done"
|
||||
|
||||
if request.method == 'GET':
|
||||
response.headers.set('Content-Type', 'application/json')
|
||||
return json.dumps(request.server.stash.take(key) or [])
|
||||
|
||||
response.status = 400
|
||||
return 'invalid method'
|
|
@ -0,0 +1,177 @@
|
|||
// Allows RegExps to be pretty printed when printing unmatched expected reports.
|
||||
Object.defineProperty(RegExp.prototype, "toJSON", {
|
||||
value: RegExp.prototype.toString
|
||||
});
|
||||
|
||||
function wait(ms) {
|
||||
return new Promise(resolve => step_timeout(resolve, ms));
|
||||
}
|
||||
|
||||
async function pollReports(endpoint) {
|
||||
const res = await fetch(
|
||||
`resources/report.py?endpoint=${endpoint.name}`,
|
||||
{cache: 'no-store'});
|
||||
if (res.status !== 200) {
|
||||
return;
|
||||
}
|
||||
for (const report of await res.json()) {
|
||||
endpoint.reports.push(report);
|
||||
}
|
||||
}
|
||||
|
||||
// Recursively check that all members of expectedReport are present or matched
|
||||
// in report.
|
||||
// Report may have members not explicitly expected by expectedReport.
|
||||
function isObjectAsExpected(report, expectedReport) {
|
||||
if (( report === undefined || report === null
|
||||
|| expectedReport === undefined || expectedReport === null )
|
||||
&& report !== expectedReport ) {
|
||||
return false;
|
||||
}
|
||||
if (expectedReport instanceof RegExp && typeof report === "string") {
|
||||
return expectedReport.test(report);
|
||||
}
|
||||
// Perform this check now, as RegExp and strings above have different typeof.
|
||||
if (typeof report !== typeof expectedReport)
|
||||
return false;
|
||||
if (typeof expectedReport === 'object') {
|
||||
return Object.keys(expectedReport).every(key => {
|
||||
return isObjectAsExpected(report[key], expectedReport[key]);
|
||||
});
|
||||
}
|
||||
return report == expectedReport;
|
||||
}
|
||||
|
||||
async function checkForExpectedReport(expectedReport) {
|
||||
return new Promise( async (resolve, reject) => {
|
||||
const polls = 30;
|
||||
const waitTime = 100;
|
||||
for (var i=0; i < polls; ++i) {
|
||||
pollReports(expectedReport.endpoint);
|
||||
for (var j=0; j<expectedReport.endpoint.reports.length; ++j){
|
||||
if (isObjectAsExpected(expectedReport.endpoint.reports[j],
|
||||
expectedReport.report)){
|
||||
expectedReport.endpoint.reports.splice(j,1);
|
||||
resolve();
|
||||
}
|
||||
};
|
||||
await wait(waitTime);
|
||||
}
|
||||
reject("No report matched the expected report for endpoint: "
|
||||
+ expectedReport.endpoint.name
|
||||
+ ", expected report: " + JSON.stringify(expectedReport.report)
|
||||
+ ", within available reports: "
|
||||
+ JSON.stringify(expectedReport.endpoint.reports)
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function replaceFromRegexOrString(str, match, value) {
|
||||
if (str instanceof RegExp) {
|
||||
return RegExp(str.source.replace(match, value));
|
||||
}
|
||||
return str.replace(match, value);
|
||||
}
|
||||
|
||||
// Replace generated values in regexes and strings of an expected report:
|
||||
// CHANNEL_NAME: the channel name is generated from the test parameters.
|
||||
function replaceValuesInExpectedReport(expectedReport, channelName) {
|
||||
if (expectedReport.report.body !== undefined) {
|
||||
if (expectedReport.report.body["document-uri"] !== undefined) {
|
||||
expectedReport.report.body["document-uri"] = replaceFromRegexOrString(
|
||||
expectedReport.report.body["document-uri"], "CHANNEL_NAME",
|
||||
channelName);
|
||||
}
|
||||
if (expectedReport.report.body["navigation-uri"] !== undefined) {
|
||||
expectedReport.report.body["navigation-uri"] = replaceFromRegexOrString(
|
||||
expectedReport.report.body["navigation-uri"], "CHANNEL_NAME",
|
||||
channelName);
|
||||
}
|
||||
}
|
||||
if (expectedReport.report.url !== undefined) {
|
||||
expectedReport.report.url = replaceFromRegexOrString(
|
||||
expectedReport.report.url, "CHANNEL_NAME", channelName);
|
||||
}
|
||||
return expectedReport;
|
||||
}
|
||||
|
||||
// Run a test (such as coop_coep_test from ./common.js) then check that all
|
||||
// expected reports are present.
|
||||
async function reportingTest(testFunction, channelName, expectedReports) {
|
||||
await new Promise( async resolve => {
|
||||
testFunction(resolve);
|
||||
});
|
||||
expectedReports = Array.from(
|
||||
expectedReports,
|
||||
report => replaceValuesInExpectedReport(report, channelName) );
|
||||
await Promise.all(Array.from(expectedReports, checkForExpectedReport));
|
||||
}
|
||||
|
||||
function coopCoepReportingTest(testName, host, coop, coep, hasOpener,
|
||||
expectedReports){
|
||||
const channelName = `${testName.replace(/[ ;"=]/g,"-")}_to_${host.name}_${coop.replace(/[ ;"=]/g,"-")}_${coep}`;
|
||||
promise_test(async t => {
|
||||
await reportingTest( (resolve) => {
|
||||
coop_coep_test(t, host, coop, coep, channelName,
|
||||
hasOpener, undefined /* openerDOMAccess */, resolve);
|
||||
}, channelName, expectedReports);
|
||||
}, `coop reporting test ${channelName}`);
|
||||
}
|
||||
|
||||
// Run an array of reporting tests then verify there's no reports that were not
|
||||
// expected.
|
||||
// Tests' elements contain: host, coop, coep, hasOpener, expectedReports.
|
||||
// See isObjectAsExpected for explanations regarding the matching behavior.
|
||||
function runCoopReportingTest(testName, tests){
|
||||
tests.forEach( test => {
|
||||
coopCoepReportingTest(testName, ...test);
|
||||
});
|
||||
verifyRemainingReports();
|
||||
}
|
||||
|
||||
const reportEndpoint = {
|
||||
name: "coop-report-endpoint",
|
||||
reports: []
|
||||
}
|
||||
const reportOnlyEndpoint = {
|
||||
name: "coop-report-only-endpoint",
|
||||
reports: []
|
||||
}
|
||||
const popupReportEndpoint = {
|
||||
name: "coop-popup-report-endpoint",
|
||||
reports: []
|
||||
}
|
||||
const popupReportOnlyEndpoint = {
|
||||
name: "coop-popup-report-only-endpoint",
|
||||
reports: []
|
||||
}
|
||||
const redirectReportEndpoint = {
|
||||
name: "coop-redirect-report-endpoint",
|
||||
reports: []
|
||||
}
|
||||
const redirectReportOnlyEndpoint = {
|
||||
name: "coop-redirect-report-only-endpoint",
|
||||
reports: []
|
||||
}
|
||||
|
||||
const reportEndpoints = [
|
||||
reportEndpoint,
|
||||
reportOnlyEndpoint,
|
||||
popupReportEndpoint,
|
||||
popupReportOnlyEndpoint,
|
||||
redirectReportEndpoint,
|
||||
redirectReportOnlyEndpoint
|
||||
]
|
||||
|
||||
function verifyRemainingReports() {
|
||||
promise_test( async t => {
|
||||
await Promise.all(Array.from(reportEndpoints, (endpoint) => {
|
||||
return new Promise( async (resolve, reject) => {
|
||||
await pollReports(endpoint);
|
||||
if (endpoint.reports.length != 0)
|
||||
reject( `${endpoint.name} not empty`);
|
||||
resolve();
|
||||
});
|
||||
}));
|
||||
}, "verify remaining reports");
|
||||
}
|
|
@ -124,7 +124,7 @@ promise_test(t => {
|
|||
const sendString = 'hello\uD999';
|
||||
const receiveString = 'hello\uFFFD';
|
||||
|
||||
return createDataChannelPair()
|
||||
return createDataChannelPair(t)
|
||||
.then(([channel1, channel2]) => {
|
||||
channel1.send(sendString);
|
||||
return awaitMessage(channel2)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
thirty_two_megabytes = 32 * 1024 * 1024
|
||||
chunk = 'ab' * 512 * 512
|
||||
chunk = b'ab' * 512 * 512
|
||||
chunk_length = len(chunk)
|
||||
|
||||
def main(request, response):
|
||||
|
@ -9,4 +9,4 @@ def main(request, response):
|
|||
yield chunk
|
||||
bytes_sent += chunk_length
|
||||
|
||||
return [("Content-Type", "text/plain")], content()
|
||||
return [(b"Content-Type", b"text/plain")], content()
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
<!doctype html>
|
||||
<html class="reftest-wait">
|
||||
<title>Rendering of iframe element with src attribute from another domain</title>
|
||||
<link rel="match" href="cross-domain-iframe.sub-ref.html">
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#embedded-content-rendering-rules">
|
||||
<meta name="assert" content="Checks that iframe content is correctly rendered even if it is retrieved from a different domain.">
|
||||
<iframe src="http://{{domains[www1]}}:{{ports[http][0]}}/images/green.png"></iframe>
|
||||
<iframe id=myframe src="http://{{domains[www1]}}:{{ports[http][0]}}/images/green.png"></iframe>
|
||||
<script>
|
||||
myframe.onload = () => document.documentElement.classList.remove('reftest-wait');
|
||||
</script>
|
||||
</html>
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
<audio id="a"></audio>
|
||||
<iframe id="i"></iframe>
|
||||
<script>
|
||||
var a = document.getElementById("a");
|
||||
i.contentDocument.documentElement.appendChild(a);
|
||||
i.remove();
|
||||
a.play();
|
||||
</script>
|
|
@ -0,0 +1,6 @@
|
|||
<iframe id="i"></iframe>
|
||||
<script>
|
||||
var doc = i.contentDocument;
|
||||
i.remove();
|
||||
doc.createElement("img");
|
||||
</script>
|
|
@ -0,0 +1,7 @@
|
|||
<iframe id="i"></iframe>
|
||||
<video id="v"></video>
|
||||
<script>
|
||||
var doc = i.contentDocument;
|
||||
i.remove();
|
||||
doc.importNode(v);
|
||||
</script>
|
|
@ -0,0 +1,23 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<link rel="author" title="Joey Arhar" href="mailto:jarhar@chromium.org">
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<!-- This behavior is not explicitly specified. -->
|
||||
|
||||
<iframe id=myframe name=framename></iframe>
|
||||
<form id=myform target=framename action="resources/form.html"></form>
|
||||
|
||||
<script>
|
||||
async_test(t => {
|
||||
myframe.onload = t.step_func_done(() => {
|
||||
assert_equals(
|
||||
myframe.contentDocument.location.pathname,
|
||||
'/html/semantics/forms/form-submission-0/resources/location.html');
|
||||
});
|
||||
myform.submit();
|
||||
myframe.contentDocument.location = 'resources/location.html';
|
||||
}, 'Verifies that location navigations take precedence when following form submissions.');
|
||||
</script>
|
|
@ -0,0 +1,4 @@
|
|||
<!DOCTYPE html>
|
||||
<body>
|
||||
form.html
|
||||
</body>
|
|
@ -0,0 +1,4 @@
|
|||
<!DOCTYPE html>
|
||||
<body>
|
||||
location.html
|
||||
</body>
|
|
@ -0,0 +1,14 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
|
||||
<select>
|
||||
<option>foo</option>
|
||||
</select>
|
||||
|
||||
<select multiple>
|
||||
<option>bar</option>
|
||||
</select>
|
||||
|
||||
</bod>
|
||||
</html>
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue