mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
Auto merge of #27889 - servo-wpt-sync:wpt_update_01-12-2020, r=servo-wpt-sync
Sync WPT with upstream (01-12-2020) Automated downstream sync of changes from upstream as of 01-12-2020. [no-wpt-sync] r? @servo-wpt-sync
This commit is contained in:
commit
a3e9e3f2bc
84 changed files with 1313 additions and 302 deletions
|
@ -0,0 +1,4 @@
|
|||
[hit-test-floats-002.html]
|
||||
[Hit test float]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[hit-test-floats-003.html]
|
||||
[Miss float below something else]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[hit-test-floats-004.html]
|
||||
[Miss float below something else]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[hit-test-floats-005.html]
|
||||
[Miss clipped float]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
[flex-minimum-size-003.html]
|
||||
[img 1]
|
||||
expected: FAIL
|
||||
|
||||
[img 2]
|
||||
expected: FAIL
|
||||
|
|
@ -2,3 +2,6 @@
|
|||
[Hit test intersecting scaled box]
|
||||
expected: FAIL
|
||||
|
||||
[Hit test within unscaled box]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -17,6 +17,3 @@
|
|||
[test the top of layer]
|
||||
expected: FAIL
|
||||
|
||||
[test some point of the element: top left corner]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
@ -309,24 +309,15 @@
|
|||
[Response: combined response Content-Type: text/html;" \\" text/plain ";charset=GBK]
|
||||
expected: NOTRUN
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html;" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: */* text/html]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
|
||||
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 ]
|
||||
[<iframe>: combined response Content-Type: text/html;" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -56,6 +56,3 @@
|
|||
[separate text/javascript x/x]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript; charset=windows-1252 text/javascript]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -11,6 +11,6 @@
|
|||
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
|
||||
expected: FAIL
|
||||
|
||||
[Content-Type-Options%3A%20nosniff]
|
||||
[X-Content-Type-Options%3A%20no%0D%0AX-Content-Type-Options%3A%20nosniff]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[traverse_the_history_1.html]
|
||||
[Multiple history traversals from the same task]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[traverse_the_history_5.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
[creating_browsing_context_test_01.html]
|
||||
expected: TIMEOUT
|
||||
[first argument: absolute url]
|
||||
expected: FAIL
|
||||
expected: TIMEOUT
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
[iframe_sandbox_popups_escaping-1.html]
|
||||
expected: TIMEOUT
|
||||
expected: CRASH
|
||||
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
||||
expected: TIMEOUT
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
[iframe_sandbox_popups_escaping-3.html]
|
||||
expected: TIMEOUT
|
||||
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
||||
expected: FAIL
|
||||
expected: TIMEOUT
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[form-double-submit-3.html]
|
||||
[<button> should have the same double-submit protection as <input type=submit>]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[activation-behavior.window.html]
|
||||
[<a> that is not connected should be followed]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[module-delayed.html]
|
||||
[async document.write in a module]
|
||||
expected: FAIL
|
||||
|
|
@ -3,3 +3,6 @@
|
|||
[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,19 @@
|
|||
[navigator-window-controls-overlay.html]
|
||||
[getBoundingClientRect should be a method of the windowControlsOverlay object]
|
||||
expected: FAIL
|
||||
|
||||
[visible should be false]
|
||||
expected: FAIL
|
||||
|
||||
[getBoundingClientRect return type should be DOMRect]
|
||||
expected: FAIL
|
||||
|
||||
[visible should be a member of the windowControlsOverlay object]
|
||||
expected: FAIL
|
||||
|
||||
[the windowControlsOverlay object should exist on the navigator object]
|
||||
expected: FAIL
|
||||
|
||||
[getBoundingClientRect should return a empty DOMRect]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
[realtimeanalyser-fft-scaling.html]
|
||||
expected: TIMEOUT
|
||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -344,3 +344,6 @@
|
|||
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[28696\]\t1.7388302799288880e-27\t9.3139332532882690e-1\t9.3139332532882690e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\t[28697\]\t7.0477002859115601e-1\t9.0675884485244751e-1\t2.0198881626129150e-1\t2.2275913536212616e-1\t3.8985999999999999e-3\n\tMax AbsError of 9.3139332532882690e-1 at index of 28696.\n\tMax RelError of 1.0000000000000000e+0 at index of 28696.\n]
|
||||
expected: FAIL
|
||||
|
||||
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[28696\]\t-2.6532444456922729e-32\t9.3139332532882690e-1\t9.3139332532882690e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\t[28697\]\t7.0477002859115601e-1\t9.0675884485244751e-1\t2.0198881626129150e-1\t2.2275913536212616e-1\t3.8985999999999999e-3\n\tMax AbsError of 9.3139332532882690e-1 at index of 28696.\n\tMax RelError of 1.0000000000000000e+0 at index of 28696.\n]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
[audiocontext-not-fully-active.html]
|
||||
expected: TIMEOUT
|
||||
[frame in navigated remote-site frame]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
[Worker-constructor.html]
|
||||
expected: ERROR
|
|
@ -370,6 +370,13 @@
|
|||
]
|
||||
},
|
||||
"css-pseudo": {
|
||||
"file-selector-button-display-none-overflow-crash.html": [
|
||||
"81051741c29824bb79460f6dba1b147b9e79de45",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"file-selector-button-display-toggle-crash.tentative.html": [
|
||||
"bc9f24ae0194fc3b59a1f0da7e8c2e13cf9eb9c5",
|
||||
[
|
||||
|
@ -24102,15 +24109,15 @@
|
|||
]
|
||||
},
|
||||
"web-nfc": {
|
||||
"NDEFReader-document-hidden-manual.https.html": [
|
||||
"ffbd7ebc45618a905b91eaa5a6cfa4f41f8efcd9",
|
||||
"NDEFReader-read-document-hidden-manual.https.html": [
|
||||
"47c1332713eef2069820a2149a79dd667e6a62ad",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"NDEFWriter-document-hidden-manual.https.html": [
|
||||
"1a2839857bb69fc06b6ea779e138b17cf54ca580",
|
||||
"NDEFReader-write-document-hidden-manual.https.html": [
|
||||
"150e5a239cfb6dcb6b05288006e80d401ec762a7",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -24283,6 +24290,122 @@
|
|||
"print-reftest": {
|
||||
"css": {
|
||||
"css-break": {
|
||||
"block-001-wm-vlr-print.html": [
|
||||
"6cd5ea07c7b2a132cef7d26abd4204cb157b5eae",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/css-break/block-001-wm-vlr-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{
|
||||
"fuzzy": [
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
0,
|
||||
60
|
||||
],
|
||||
[
|
||||
0,
|
||||
200
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
],
|
||||
"block-001-wm-vrl-print.html": [
|
||||
"6e073121c6acf3b7c5b381e230365fcf4b7e6d56",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/css-break/block-001-wm-vrl-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{
|
||||
"fuzzy": [
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
0,
|
||||
60
|
||||
],
|
||||
[
|
||||
0,
|
||||
200
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
],
|
||||
"block-002-wm-vlr-print.html": [
|
||||
"99949623c3923e529687e75ee18e849bfc852180",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/css-break/block-002-wm-vlr-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{
|
||||
"fuzzy": [
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
0,
|
||||
35
|
||||
],
|
||||
[
|
||||
0,
|
||||
220
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
],
|
||||
"block-002-wm-vrl-print.html": [
|
||||
"084b5325b7ac40ee5b81f22cd542e5b3f5c16b57",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/css-break/block-002-wm-vrl-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{
|
||||
"fuzzy": [
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
0,
|
||||
35
|
||||
],
|
||||
[
|
||||
0,
|
||||
220
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
],
|
||||
"break-nested-float-in-table-001-print.html": [
|
||||
"e4e0a578e9a6c6d763fcb9e80d6ff8b91561f3e5",
|
||||
[
|
||||
|
@ -24295,6 +24418,19 @@
|
|||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"ink-overflow-001-print.html": [
|
||||
"495153d3d423b014aa40aeed87ea0a899edce1f5",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"about:blank",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
]
|
||||
},
|
||||
"css-flexbox": {
|
||||
|
@ -128068,6 +128204,19 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"ink-overflow-002.html": [
|
||||
"8af605efea87b618007641729bd3b579fcb654eb",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/reference/ref-filled-green-100px-square.xht",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"line-after-unbreakable-float-after-padding.html": [
|
||||
"d3a4018cd809fc09eb68c1b25f4dda4736e64131",
|
||||
[
|
||||
|
@ -161670,6 +161819,19 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"multicol-fill-balance-005.html": [
|
||||
"ad9a592ec9355ded07383e2071d1dda786ba5f8f",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/reference/ref-filled-green-100px-square.xht",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"multicol-gap-000.xht": [
|
||||
"88aa17e8b488565dc40398e6e8f1d2e3bf3a97a1",
|
||||
[
|
||||
|
@ -168602,6 +168764,32 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"first-letter-skip-empty-span-nested.html": [
|
||||
"e57700bbbd61246c93a5e2bae00659d87a4981dc",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/css-pseudo/first-letter-skip-empty-span-nested-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"first-letter-skip-empty-span.html": [
|
||||
"d3914050ad892a13df3d5caacc238488175ac5c3",
|
||||
[
|
||||
null,
|
||||
[
|
||||
[
|
||||
"/css/css-pseudo/first-letter-skip-empty-span-ref.html",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"first-letter-skip-marker.html": [
|
||||
"fb9fe258472e3a0e338f12246469e9499b4c2601",
|
||||
[
|
||||
|
@ -301493,6 +301681,22 @@
|
|||
"5c3363562ab196a5c5cdb6e72b471b52e0cc8375",
|
||||
[]
|
||||
],
|
||||
"block-001-wm-vlr-ref.html": [
|
||||
"b131b0e486084ed3a127ac07c23425f8e50be93a",
|
||||
[]
|
||||
],
|
||||
"block-001-wm-vrl-ref.html": [
|
||||
"6fb7e7353c7ab73a11c459088d0368f9e96f1484",
|
||||
[]
|
||||
],
|
||||
"block-002-wm-vlr-ref.html": [
|
||||
"d3193f20c4f69ccbed481829df9d8be57a1238ab",
|
||||
[]
|
||||
],
|
||||
"block-002-wm-vrl-ref.html": [
|
||||
"8b5ea92af5fd248ae3994d24e19375f301de98d1",
|
||||
[]
|
||||
],
|
||||
"block-end-aligned-abspos-with-overflow-ref.html": [
|
||||
"a8470b09a7d67eb3929c0380eaa45779c2b558ad",
|
||||
[]
|
||||
|
@ -311964,7 +312168,7 @@
|
|||
[]
|
||||
],
|
||||
"masonry-fragmentation-001-ref.html": [
|
||||
"de3fe6f402d31c7256b3f9c36c4db857645beb97",
|
||||
"c9318ae0bba5ba6419bab7d36fd37720af8fb3b1",
|
||||
[]
|
||||
],
|
||||
"masonry-fragmentation-002-ref.html": [
|
||||
|
@ -315595,6 +315799,14 @@
|
|||
"38c230045bd0cbec0d94da16b27fd56aa58456a1",
|
||||
[]
|
||||
],
|
||||
"first-letter-skip-empty-span-nested-ref.html": [
|
||||
"95c2f94a6b7f35f0c91b5aec314d79e38dc7fe5d",
|
||||
[]
|
||||
],
|
||||
"first-letter-skip-empty-span-ref.html": [
|
||||
"27a364546e7c56c8aa6baee11615f4950576404d",
|
||||
[]
|
||||
],
|
||||
"first-letter-skip-marker-ref.html": [
|
||||
"82c5074fd26aa2dc35c9c8fa77dd3bf1099c5f88",
|
||||
[]
|
||||
|
@ -359735,7 +359947,7 @@
|
|||
[]
|
||||
],
|
||||
"helpers.js": [
|
||||
"70808e8db7b11db236b893cfd7147458154f69ce",
|
||||
"0be3add620065a9303bbe6878487f94771c51e0b",
|
||||
[]
|
||||
]
|
||||
}
|
||||
|
@ -368452,12 +368664,12 @@
|
|||
[]
|
||||
],
|
||||
"chromium.py": [
|
||||
"cef01c4ffc5dd2df67ddfb6ed746d3ea4c5c4d76",
|
||||
"3c52f76965b144ba1845c1f6e60fc6ea0bb63d54",
|
||||
[]
|
||||
],
|
||||
"tests": {
|
||||
"test_chromium.py": [
|
||||
"8f8e732d4736337ccfecbb13f1fb8b590c9df52a",
|
||||
"807f5837f7964e329d05377b34029c6ab727611f",
|
||||
[]
|
||||
]
|
||||
},
|
||||
|
@ -370230,7 +370442,7 @@
|
|||
],
|
||||
"resources": {
|
||||
"nfc-helpers.js": [
|
||||
"0b26d09c96aa8f29ef6d5646c187af0a2a5100a8",
|
||||
"659f74ed8b128f8fb785eced13f90e21c53439b7",
|
||||
[]
|
||||
],
|
||||
"support-iframe.html": [
|
||||
|
@ -399428,7 +399640,7 @@
|
|||
]
|
||||
],
|
||||
"otpcredential-iframe.https.html": [
|
||||
"8af17b599612e3750f3094270be8e9cd9a109290",
|
||||
"da3e572b6b5771fcc55f5bf828a1a0a0a6606fa3",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -403658,6 +403870,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"flex-minimum-size-003.html": [
|
||||
"95d9e37d0bdcccbc3f418dc007948425577396f2",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"flex-minimum-width-flex-items-014.html": [
|
||||
"080169b52d7fdf39cbf6ff970c3100480e46d2a3",
|
||||
[
|
||||
|
@ -442123,6 +442342,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"en-euro-windows-1252.tentative.html": [
|
||||
"c2835e7d98a5c00d530b0b70c9de94d4f153c4ca",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"en-windows-1252.tentative.html": [
|
||||
"ac8cbe83fe201e7c538d17434fdfbab9456e6bff",
|
||||
[
|
||||
|
@ -493696,6 +493922,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"navigator-window-controls-overlay.html": [
|
||||
"069ff1602a621f55a9414a383f2ca03875fade15",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"navigator.any.js": [
|
||||
"07bccb788052e7ce2cb722558e416b5c017ed9f0",
|
||||
[
|
||||
|
@ -496688,7 +496921,7 @@
|
|||
]
|
||||
],
|
||||
"content-visibility-auto-offscreen.html": [
|
||||
"8356a340dfb0b515b84ee8c8f14827d362305e30",
|
||||
"af60412a87f0ab5f532c6e4f0aae0e31d6f84bc5",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -496701,6 +496934,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"content-visibility-auto-resize.html": [
|
||||
"b8de7f52e325e5789a64ff306daf33481078fee7",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"content-visibility-hidden.html": [
|
||||
"939b1a212233a5be7b0b9611fe07cf062a11ffe0",
|
||||
[
|
||||
|
@ -543021,14 +543261,21 @@
|
|||
]
|
||||
],
|
||||
"NDEFReader_scan.https.html": [
|
||||
"b551af0150f068b0794047cdfb08c862ac3bbb4b",
|
||||
"0a8d8cb25a567a795dda572e963d74997de35406",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"NDEFReader_scan_iframe.https.html": [
|
||||
"8803c25fb0a54fe13b23eb455e6da09c422aa3d4",
|
||||
"6967c76ecd6d6bf6bfcb26c146931312f224734a",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"NDEFReader_write.https.html": [
|
||||
"d1541b1b525828ee2f550fdb866365b683f31746",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
@ -543048,13 +543295,6 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"NDEFWriter_write.https.html": [
|
||||
"57fd300a34f9b8fddf0489dec6048b4a55273f54",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"idlharness.https.window.js": [
|
||||
"e2000abce8da4e44e793b0f935340b1348033cef",
|
||||
[
|
||||
|
@ -543079,7 +543319,7 @@
|
|||
]
|
||||
],
|
||||
"nfc_insecure_context.html": [
|
||||
"9a8e58cf802fceb818fa93000cb5a3db75bddc14",
|
||||
"8c2eb5a14275b7a301ac418b2c5be48bd03705ed",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[hit-test-floats-002.html]
|
||||
[Hit test float]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[hit-test-floats-003.html]
|
||||
[Miss float below something else]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[hit-test-floats-004.html]
|
||||
[Miss float below something else]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[hit-test-floats-005.html]
|
||||
[Miss clipped float]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
[flex-minimum-size-003.html]
|
||||
[img 1]
|
||||
expected: FAIL
|
||||
|
||||
[img 2]
|
||||
expected: FAIL
|
||||
|
|
@ -2,3 +2,6 @@
|
|||
[Hit test intersecting scaled box]
|
||||
expected: FAIL
|
||||
|
||||
[Hit test within unscaled box]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -21,6 +21,3 @@
|
|||
[test the top of layer]
|
||||
expected: FAIL
|
||||
|
||||
[test some point of the element: top left corner]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
@ -309,24 +309,15 @@
|
|||
[fetch(): separate response Content-Type: text/plain ]
|
||||
expected: NOTRUN
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html;" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: */* text/html]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
|
||||
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 ]
|
||||
[<iframe>: combined response Content-Type: text/html;" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
|
||||
expected: FAIL
|
||||
|
||||
[<iframe>: combined response Content-Type: text/html;x=" text/plain]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -56,6 +56,3 @@
|
|||
[separate text/javascript x/x]
|
||||
expected: FAIL
|
||||
|
||||
[separate text/javascript; charset=windows-1252 text/javascript]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -11,6 +11,6 @@
|
|||
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
|
||||
expected: FAIL
|
||||
|
||||
[Content-Type-Options%3A%20nosniff]
|
||||
[X-Content-Type-Options%3A%20no%0D%0AX-Content-Type-Options%3A%20nosniff]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[traverse_the_history_1.html]
|
||||
[Multiple history traversals from the same task]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[traverse_the_history_5.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
[creating_browsing_context_test_01.html]
|
||||
expected: TIMEOUT
|
||||
[first argument: absolute url]
|
||||
expected: FAIL
|
||||
expected: TIMEOUT
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
[iframe_sandbox_popups_escaping-1.html]
|
||||
type: testharness
|
||||
expected: TIMEOUT
|
||||
expected: CRASH
|
||||
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
||||
expected: TIMEOUT
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
[iframe_sandbox_popups_escaping-3.html]
|
||||
type: testharness
|
||||
expected: TIMEOUT
|
||||
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
|
||||
expected: FAIL
|
||||
expected: TIMEOUT
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[form-double-submit-3.html]
|
||||
[<button> should have the same double-submit protection as <input type=submit>]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[activation-behavior.window.html]
|
||||
[<a> that is not connected should be followed]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[module-delayed.html]
|
||||
[async document.write in a module]
|
||||
expected: FAIL
|
||||
|
|
@ -4,3 +4,6 @@
|
|||
[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,19 @@
|
|||
[navigator-window-controls-overlay.html]
|
||||
[getBoundingClientRect should be a method of the windowControlsOverlay object]
|
||||
expected: FAIL
|
||||
|
||||
[visible should be false]
|
||||
expected: FAIL
|
||||
|
||||
[getBoundingClientRect return type should be DOMRect]
|
||||
expected: FAIL
|
||||
|
||||
[visible should be a member of the windowControlsOverlay object]
|
||||
expected: FAIL
|
||||
|
||||
[the windowControlsOverlay object should exist on the navigator object]
|
||||
expected: FAIL
|
||||
|
||||
[getBoundingClientRect should return a empty DOMRect]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
[realtimeanalyser-fft-scaling.html]
|
||||
expected: TIMEOUT
|
||||
[X 2048-point FFT peak position is not equal to 64. Got 0.]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -572,3 +572,6 @@
|
|||
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[28696\]\t1.7388302799288880e-27\t9.3139332532882690e-1\t9.3139332532882690e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\t[28697\]\t7.0477002859115601e-1\t9.0675884485244751e-1\t2.0198881626129150e-1\t2.2275913536212616e-1\t3.8985999999999999e-3\n\tMax AbsError of 9.3139332532882690e-1 at index of 28696.\n\tMax RelError of 1.0000000000000000e+0 at index of 28696.\n]
|
||||
expected: FAIL
|
||||
|
||||
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[28696\]\t-2.6532444456922729e-32\t9.3139332532882690e-1\t9.3139332532882690e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\t[28697\]\t7.0477002859115601e-1\t9.0675884485244751e-1\t2.0198881626129150e-1\t2.2275913536212616e-1\t3.8985999999999999e-3\n\tMax AbsError of 9.3139332532882690e-1 at index of 28696.\n\tMax RelError of 1.0000000000000000e+0 at index of 28696.\n]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
[audiocontext-not-fully-active.html]
|
||||
expected: TIMEOUT
|
||||
[frame in navigated remote-site frame]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
[Worker-constructor.html]
|
||||
expected: ERROR
|
|
@ -27,6 +27,19 @@ promise_test(async t => {
|
|||
|
||||
}, "Test OTPCredential enabled in same origin iframes");
|
||||
|
||||
promise_test(async t => {
|
||||
const messageWatcher = new EventWatcher(t, window, "message");
|
||||
var iframe = document.createElement("iframe");
|
||||
iframe.src = remoteBaseURL + "support/otpcredential-iframe.html"
|
||||
iframe.allow = "otp-credentials";
|
||||
document.body.appendChild(iframe);
|
||||
|
||||
const message = await messageWatcher.wait_for("message");
|
||||
assert_equals(message.data.result, "Pass");
|
||||
assert_equals(message.data.code, "ABC123");
|
||||
|
||||
}, "OTPCredential enabled in cross origin iframes with permissions policy");
|
||||
|
||||
promise_test(async t => {
|
||||
const messageWatcher = new EventWatcher(t, window, "message");
|
||||
var iframe = document.createElement("iframe");
|
||||
|
@ -37,5 +50,5 @@ promise_test(async t => {
|
|||
assert_equals(message.data.result, "Fail");
|
||||
assert_equals(message.data.errorType, "NotAllowedError");
|
||||
|
||||
}, "Test OTPCredential disabled in cross origin iframes");
|
||||
}, "OTPCredential disabled in cross origin iframes without permissions policy");
|
||||
</script>
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
|
||||
<link rel="help" href="https://www.w3.org/TR/css-break-3/">
|
||||
<link rel="match" href="block-001-wm-vlr-ref.html">
|
||||
<meta name="flags" content="paged">
|
||||
<meta name="fuzzy" content="maxDifference=0-60;totalPixels=0-200">
|
||||
<html>
|
||||
<style>
|
||||
@page {
|
||||
size: 5in 3in;
|
||||
margin: 0.5in;
|
||||
}
|
||||
|
||||
html,body {
|
||||
color:black; background-color:white; font:20px/1 monospace; padding:0; margin:0;
|
||||
writing-mode: vertical-lr;
|
||||
}
|
||||
html { block-size: 40vw; }
|
||||
|
||||
.b {
|
||||
inline-size: 50vh;
|
||||
block-size: 210vw;
|
||||
box-sizing: border-box;
|
||||
border: 5px solid black;
|
||||
border-block-start-color: blue;
|
||||
border-inline-start-color: lime;
|
||||
margin-inline-start: 20px;
|
||||
margin-block-end: -20px;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<div class="b"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,48 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
|
||||
<meta name="flags" content="paged">
|
||||
<html>
|
||||
<style>
|
||||
@page {
|
||||
size: 5in 3in;
|
||||
margin: 0.5in;
|
||||
}
|
||||
|
||||
html,body {
|
||||
color:black; background-color:white; font:20px/1 monospace; padding:0; margin:0;
|
||||
writing-mode: vertical-lr;
|
||||
}
|
||||
html { block-size: 40vw; }
|
||||
|
||||
.b {
|
||||
box-sizing: border-box;
|
||||
inline-size: 50vh;
|
||||
border: 5px solid black;
|
||||
border-block-start-color: blue;
|
||||
border-inline-start-color: lime;
|
||||
margin-inline-start: 20px;
|
||||
}
|
||||
|
||||
.b1 {
|
||||
block-size: 100vw;
|
||||
border-block-end-style: none;
|
||||
}
|
||||
|
||||
.b2 {
|
||||
block-size: 100vw;
|
||||
border-block-start-style: none;
|
||||
border-block-end-style: none;
|
||||
}
|
||||
|
||||
.b3 {
|
||||
block-size: 10vw;
|
||||
border-block-start-style: none;
|
||||
margin-block-end: -20px;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<div class="b b1"></div>
|
||||
<div class="b b2"></div>
|
||||
<div class="b b3"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,33 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
|
||||
<link rel="help" href="https://www.w3.org/TR/css-break-3/">
|
||||
<link rel="match" href="block-001-wm-vrl-ref.html">
|
||||
<meta name="flags" content="paged">
|
||||
<meta name="fuzzy" content="maxDifference=0-60;totalPixels=0-200">
|
||||
<html>
|
||||
<style>
|
||||
@page {
|
||||
size: 5in 3in;
|
||||
margin: 0.5in;
|
||||
}
|
||||
|
||||
html,body {
|
||||
color:black; background-color:white; font:20px/1 monospace; padding:0; margin:0;
|
||||
writing-mode: vertical-rl;
|
||||
}
|
||||
html { block-size: 40vw; }
|
||||
|
||||
.b {
|
||||
inline-size: 50vh;
|
||||
block-size: 210vw;
|
||||
box-sizing: border-box;
|
||||
border: 5px solid black;
|
||||
border-block-start-color: blue;
|
||||
border-inline-start-color: lime;
|
||||
margin-inline-start: 20px;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<div class="b"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,48 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
|
||||
<meta name="flags" content="paged">
|
||||
<html>
|
||||
<style>
|
||||
@page {
|
||||
size: 5in 3in;
|
||||
margin: 0.5in;
|
||||
}
|
||||
|
||||
html,body {
|
||||
color:black; background-color:white; font:20px/1 monospace; padding:0; margin:0;
|
||||
writing-mode: vertical-rl;
|
||||
}
|
||||
html { block-size: 40vw; }
|
||||
|
||||
.b {
|
||||
box-sizing: border-box;
|
||||
inline-size: 50vh;
|
||||
border: 5px solid black;
|
||||
border-block-start-color: blue;
|
||||
border-inline-start-color: lime;
|
||||
margin-inline-start: 20px;
|
||||
}
|
||||
|
||||
.b1 {
|
||||
block-size: 100vw;
|
||||
border-block-end-style: none;
|
||||
}
|
||||
|
||||
.b2 {
|
||||
block-size: 100vw;
|
||||
border-block-start-style: none;
|
||||
border-block-end-style: none;
|
||||
}
|
||||
|
||||
.b3 {
|
||||
block-size: 10vw;
|
||||
border-block-start-style: none;
|
||||
margin-block-end: -20px;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<div class="b b1"></div>
|
||||
<div class="b b2"></div>
|
||||
<div class="b b3"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,51 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
|
||||
<link rel="help" href="https://www.w3.org/TR/css-break-3/">
|
||||
<link rel="match" href="block-002-wm-vlr-ref.html">
|
||||
<meta name="flags" content="paged">
|
||||
<meta name="fuzzy" content="maxDifference=0-35;totalPixels=0-220">
|
||||
<html>
|
||||
<style>
|
||||
@page {
|
||||
size: 5in 3in;
|
||||
margin: 0.5in;
|
||||
}
|
||||
|
||||
html,body {
|
||||
color:black; background-color:white; font:20px/1 monospace; padding:0; margin:0;
|
||||
writing-mode: vertical-lr;
|
||||
}
|
||||
html { margin-block-start: 80vw; }
|
||||
* { box-sizing: border-box; }
|
||||
|
||||
.b {
|
||||
inline-size: 50vh;
|
||||
block-size: 130vw;
|
||||
border: 5px solid black;
|
||||
border-block-start-color: blue;
|
||||
border-inline-start-color: lime;
|
||||
margin-inline-start: 20px;
|
||||
}
|
||||
|
||||
.b > div {
|
||||
inline-size: 50vh;
|
||||
block-size: 150vw;
|
||||
border: 5px solid grey;
|
||||
margin-inline-start: 20px;
|
||||
margin-block-start: -5px;
|
||||
}
|
||||
|
||||
.after {
|
||||
inline-size: 60vh;
|
||||
block-size: 30vw;
|
||||
margin-block-start: 5vw;
|
||||
border: 5px solid blue;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<div class="b">
|
||||
<div></div>
|
||||
</div>
|
||||
<div class="after"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,73 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
|
||||
<meta name="flags" content="paged">
|
||||
<html>
|
||||
<style>
|
||||
@page {
|
||||
size: 5in 3in;
|
||||
margin: 0.5in;
|
||||
}
|
||||
|
||||
html,body {
|
||||
color:black; background-color:white; font:20px/1 monospace; padding:0; margin:0;
|
||||
writing-mode: vertical-lr;
|
||||
}
|
||||
html { margin-block-start: 80vw; }
|
||||
* { box-sizing: border-box; }
|
||||
|
||||
.b {
|
||||
inline-size: 50vh;
|
||||
border: 5px solid black;
|
||||
border-block-start-color: blue;
|
||||
border-inline-start-color: lime;
|
||||
margin-inline-start: 20px;
|
||||
}
|
||||
.b1 {
|
||||
block-size: 20vw;
|
||||
border-block-end-style: none;
|
||||
}
|
||||
|
||||
.b2 {
|
||||
block-size: 100vw;
|
||||
border-block-start-style: none;
|
||||
border-block-end-style: none;
|
||||
}
|
||||
|
||||
.b3 {
|
||||
block-size: 10vw;
|
||||
border-block-start-style: none;
|
||||
}
|
||||
|
||||
.b > div {
|
||||
inline-size: 50vh;
|
||||
block-size: 100vw;
|
||||
border: 5px solid grey;
|
||||
margin-inline-start: 20px;
|
||||
}
|
||||
.b1 > div {
|
||||
border-block-end-style: none;
|
||||
margin-block-start: -5px;
|
||||
}
|
||||
.b2 > div {
|
||||
border-block-start-style: none;
|
||||
border-block-end-style: none;
|
||||
}
|
||||
.b3 > div {
|
||||
block-size: 30vw;
|
||||
border-block-start-style: none;
|
||||
}
|
||||
|
||||
.after {
|
||||
inline-size: 60vh;
|
||||
block-size: 30vw;
|
||||
margin-block-start: 5vw;
|
||||
border: 5px solid blue;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<div class="b b1"><div></div></div>
|
||||
<div class="b b2"><div></div></div>
|
||||
<div class="b b3"><div></div></div>
|
||||
<div class="after"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,51 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
|
||||
<link rel="help" href="https://www.w3.org/TR/css-break-3/">
|
||||
<link rel="match" href="block-002-wm-vrl-ref.html">
|
||||
<meta name="flags" content="paged">
|
||||
<meta name="fuzzy" content="maxDifference=0-35;totalPixels=0-220">
|
||||
<html>
|
||||
<style>
|
||||
@page {
|
||||
size: 5in 3in;
|
||||
margin: 0.5in;
|
||||
}
|
||||
|
||||
html,body {
|
||||
color:black; background-color:white; font:20px/1 monospace; padding:0; margin:0;
|
||||
writing-mode: vertical-rl;
|
||||
}
|
||||
html { margin-block-start: 80vw; }
|
||||
* { box-sizing: border-box; }
|
||||
|
||||
.b {
|
||||
inline-size: 50vh;
|
||||
block-size: 130vw;
|
||||
border: 5px solid black;
|
||||
border-block-start-color: blue;
|
||||
border-inline-start-color: lime;
|
||||
margin-inline-start: 20px;
|
||||
}
|
||||
|
||||
.b > div {
|
||||
inline-size: 50vh;
|
||||
block-size: 150vw;
|
||||
border: 5px solid grey;
|
||||
margin-inline-start: 20px;
|
||||
margin-block-start: -5px;
|
||||
}
|
||||
|
||||
.after {
|
||||
inline-size: 60vh;
|
||||
block-size: 30vw;
|
||||
margin-block-start: 5vw;
|
||||
border: 5px solid blue;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<div class="b">
|
||||
<div></div>
|
||||
</div>
|
||||
<div class="after"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,73 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
|
||||
<meta name="flags" content="paged">
|
||||
<html>
|
||||
<style>
|
||||
@page {
|
||||
size: 5in 3in;
|
||||
margin: 0.5in;
|
||||
}
|
||||
|
||||
html,body {
|
||||
color:black; background-color:white; font:20px/1 monospace; padding:0; margin:0;
|
||||
writing-mode: vertical-rl;
|
||||
}
|
||||
html { margin-block-start: 80vw; }
|
||||
* { box-sizing: border-box; }
|
||||
|
||||
.b {
|
||||
inline-size: 50vh;
|
||||
border: 5px solid black;
|
||||
border-block-start-color: blue;
|
||||
border-inline-start-color: lime;
|
||||
margin-inline-start: 20px;
|
||||
}
|
||||
.b1 {
|
||||
block-size: 20vw;
|
||||
border-block-end-style: none;
|
||||
}
|
||||
|
||||
.b2 {
|
||||
block-size: 100vw;
|
||||
border-block-start-style: none;
|
||||
border-block-end-style: none;
|
||||
}
|
||||
|
||||
.b3 {
|
||||
block-size: 10vw;
|
||||
border-block-start-style: none;
|
||||
}
|
||||
|
||||
.b > div {
|
||||
inline-size: 50vh;
|
||||
block-size: 100vw;
|
||||
border: 5px solid grey;
|
||||
margin-inline-start: 20px;
|
||||
}
|
||||
.b1 > div {
|
||||
border-block-end-style: none;
|
||||
margin-block-start: -5px;
|
||||
}
|
||||
.b2 > div {
|
||||
border-block-start-style: none;
|
||||
border-block-end-style: none;
|
||||
}
|
||||
.b3 > div {
|
||||
block-size: 30vw;
|
||||
border-block-start-style: none;
|
||||
}
|
||||
|
||||
.after {
|
||||
inline-size: 60vh;
|
||||
block-size: 30vw;
|
||||
margin-block-start: 5vw;
|
||||
border: 5px solid blue;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<div class="b b1"><div></div></div>
|
||||
<div class="b b2"><div></div></div>
|
||||
<div class="b b3"><div></div></div>
|
||||
<div class="after"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,23 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
|
||||
<link rel="help" href="https://www.w3.org/TR/css-break-3/">
|
||||
<link rel="match" href="about:blank">
|
||||
<meta name="flags" content="paged">
|
||||
<style>
|
||||
@page {
|
||||
size: 5in 3in;
|
||||
margin: 0.5in;
|
||||
}
|
||||
|
||||
html,body {
|
||||
color:black; background-color:white; font:20px/1 monospace; padding:0; margin:0;
|
||||
}
|
||||
|
||||
body {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
outline: 100px solid red;
|
||||
box-shadow: 100px 100px 0 #F00;
|
||||
}
|
||||
</style>
|
||||
<body></body>
|
|
@ -0,0 +1,34 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
|
||||
<link rel="help" href="https://www.w3.org/TR/css-break-3/">
|
||||
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||
<style>
|
||||
.col {
|
||||
column-width: 100px;
|
||||
column-rule: 100px solid red;
|
||||
height: 100px;
|
||||
column-fill: auto;
|
||||
gap: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.col > div {
|
||||
display: flow-root;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background: green;
|
||||
}
|
||||
|
||||
.col > div > div {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
margin-top: 80px;
|
||||
margin-left: 50px;
|
||||
outline: 30px solid green;
|
||||
box-shadow: 0 30px 0 30px green;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
<div class="col"><div><div></div></div></div>
|
||||
</body>
|
|
@ -0,0 +1,23 @@
|
|||
<!doctype html>
|
||||
<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
|
||||
<link rel="help" href="https://drafts.csswg.org/css-flexbox/#min-size-auto">
|
||||
<link rel="help" href="https://crbug.com/1151608">
|
||||
<meta name="assert" content="automatic minimum size computation doesn't overflow when multiplying by the aspect ratio" />
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/check-layout-th.js"></script>
|
||||
|
||||
<body onload="checkLayout('img')">
|
||||
|
||||
<div id=log></div>
|
||||
|
||||
<div style="display: flex; width: 300px;">
|
||||
<img src="data:image/svg+xml,%3Csvg viewBox='0 0 1 1' width='8000' height='8000' xmlns='http://www.w3.org/2000/svg' %3E%3C/svg%3E" data-expected-width=8000 style="height: 8000px;">
|
||||
</div>
|
||||
|
||||
<div style="display: flex; flex-direction: column; height: 300px;">
|
||||
<img src="data:image/svg+xml,%3Csvg viewBox='0 0 1 1' width='8000' height='8000' xmlns='http://www.w3.org/2000/svg' %3E%3C/svg%3E" data-expected-height=8000 style="width: 8000px;">
|
||||
</div>
|
||||
|
||||
</body>
|
|
@ -55,7 +55,7 @@ masonry-track {
|
|||
}
|
||||
x,y,z,masonry-track { display: block; }
|
||||
masonry-track > * { margin-bottom:2px; }
|
||||
masonry-track.last > :last-child { margin-bottom:0; }
|
||||
.last > masonry-track > :last-child { margin-bottom:0; }
|
||||
masonry-track:nth-child(1) { width: 10px; }
|
||||
masonry-track:nth-child(2) { width: 15px; margin-left:2px; }
|
||||
masonry-track:nth-child(3) { width: 20px; margin-left:2px; }
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
|
||||
<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#filling-columns">
|
||||
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
<div style="columns:2; column-gap:0; width:100px; height:20px; max-height:40px; min-height:100px; background:red;">
|
||||
<div style="height:200px; background:green;"></div>
|
||||
</div>
|
|
@ -0,0 +1,5 @@
|
|||
<link rel="author" href="mailto:mats@mozilla.com">
|
||||
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1679682">
|
||||
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/5049">
|
||||
<style>input{width:1px}::file-selector-button{display: none;}</style>
|
||||
<input type="file">
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE HTML>
|
||||
<title>Reference: The nested empty span should be skipped when finding the ::first-letter content</title>
|
||||
<link rel="author" title="Jaeyong Bae" href="jdragon.bae@gmail.com">
|
||||
<style>
|
||||
first-letter { color: green }
|
||||
</style>
|
||||
<div>
|
||||
<span><first-letter>F</first-letter>irst letter should be green</span>
|
||||
</div>
|
|
@ -0,0 +1,12 @@
|
|||
<!DOCTYPE HTML>
|
||||
<title>CSS Test: The nested empty span should be skipped when finding the ::first-letter content</title>
|
||||
<link rel="author" title="Jaeyong Bae" href="jdragon.bae@gmail.com">
|
||||
<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#application-in-css">
|
||||
<link rel="match" href="first-letter-skip-empty-span-nested-ref.html">
|
||||
<style>
|
||||
div::first-letter { color: green }
|
||||
</style>
|
||||
<div>
|
||||
<span></span>
|
||||
<span><span></span>First letter should be green</span>
|
||||
</div>
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE HTML>
|
||||
<title>Reference: The empty span should be skipped when finding the ::first-letter content</title>
|
||||
<link rel="author" title="Jaeyong Bae" href="jdragon.bae@gmail.com">
|
||||
<style>
|
||||
first-letter { color: green }
|
||||
</style>
|
||||
<div>
|
||||
<span><first-letter>F</first-letter>irst letter should be green</span>
|
||||
</div>
|
|
@ -0,0 +1,12 @@
|
|||
<!DOCTYPE HTML>
|
||||
<title>CSS Test: The empty span should be skipped when finding the ::first-letter content</title>
|
||||
<link rel="author" title="Jaeyong Bae" href="jdragon.bae@gmail.com">
|
||||
<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#application-in-css">
|
||||
<link rel="match" href="first-letter-skip-empty-span-ref.html">
|
||||
<style>
|
||||
div::first-letter { color: green }
|
||||
</style>
|
||||
<div>
|
||||
<span></span>
|
||||
<span>First letter should be green</span>
|
||||
</div>
|
|
@ -0,0 +1,14 @@
|
|||
<!doctype html>
|
||||
<title>en windows-1252 euro sign</title>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<p>It costs €9.</p>
|
||||
<script>
|
||||
setup({explicit_done:true});
|
||||
onload = function() {
|
||||
test(function() {
|
||||
assert_equals(document.characterSet, "windows-1252", 'Expected windows-1252');
|
||||
}, "Check detection result");
|
||||
done();
|
||||
};
|
||||
</script>
|
|
@ -0,0 +1,37 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset='utf-8'>
|
||||
<title>navigator.windowControlsOverlay</title>
|
||||
|
||||
<script src='/resources/testharness.js'></script>
|
||||
<script src='/resources/testharnessreport.js'></script>
|
||||
|
||||
<script>
|
||||
test(function(){
|
||||
assert_idl_attribute(navigator, 'windowControlsOverlay');
|
||||
}, 'the windowControlsOverlay object should exist on the navigator object');
|
||||
|
||||
test(function(){
|
||||
assert_idl_attribute(navigator.windowControlsOverlay, 'visible');
|
||||
}, 'visible should be a member of the windowControlsOverlay object');
|
||||
|
||||
test(function(){
|
||||
assert_false(navigator.windowControlsOverlay.visible);
|
||||
}, 'visible should be false');
|
||||
|
||||
test(function(){
|
||||
assert_idl_attribute(navigator.windowControlsOverlay, 'getBoundingClientRect');
|
||||
}, 'getBoundingClientRect should be a method of the windowControlsOverlay object');
|
||||
|
||||
test(function(){
|
||||
var rect = navigator.windowControlsOverlay.getBoundingClientRect();
|
||||
assert_true(rect instanceof DOMRect);
|
||||
}, 'getBoundingClientRect return type should be DOMRect');
|
||||
|
||||
test(function(){
|
||||
var rect = navigator.windowControlsOverlay.getBoundingClientRect();
|
||||
assert_equals(rect.x, 0);
|
||||
assert_equals(rect.y, 0);
|
||||
assert_equals(rect.width, 0);
|
||||
assert_equals(rect.height, 0);
|
||||
}, 'getBoundingClientRect should return a empty DOMRect');
|
||||
</script>
|
|
@ -2,13 +2,16 @@
|
|||
<title>Layout Instability: off-screen content-visibility:auto content</title>
|
||||
<link rel="help" href="https://wicg.github.io/layout-instability/" />
|
||||
<style>
|
||||
#target {
|
||||
#auto {
|
||||
content-visibility: auto;
|
||||
contain-intrinsic-size: 1px;
|
||||
width: 100px;
|
||||
}
|
||||
</style>
|
||||
<div id=target style="position: relative; top: 100000px">
|
||||
<div class=auto>
|
||||
<div style="width: 100px; height: 100px"></div>
|
||||
</div>
|
||||
<div class=auto style="position: relative; top: 100000px">
|
||||
<div style="width: 100px; height: 100px"></div>
|
||||
</div>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
|
@ -21,7 +24,12 @@ promise_test(async () => {
|
|||
// Wait for the initial render to complete.
|
||||
await waitForAnimationFrames(2);
|
||||
|
||||
window.scrollTo(0, 100000);
|
||||
window.scrollTo(0, 100000 + 100);
|
||||
await waitForAnimationFrames(2);
|
||||
|
||||
assert_equals(watcher.score, 0);
|
||||
|
||||
window.scrollTo(0, 0);
|
||||
await waitForAnimationFrames(2);
|
||||
|
||||
assert_equals(watcher.score, 0);
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Layout Instability: resizing content-visibility:auto content</title>
|
||||
<link rel="help" href="https://wicg.github.io/layout-instability/" />
|
||||
<style>
|
||||
.auto {
|
||||
content-visibility: auto;
|
||||
contain-intrinsic-size: 10px 3000px;
|
||||
width: 100px;
|
||||
}
|
||||
.contained {
|
||||
height: 100px;
|
||||
}
|
||||
</style>
|
||||
<div class=a><div class=contained></div></div>
|
||||
<div class=a ><div class=contained></div></div>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="resources/util.js"></script>
|
||||
<script>
|
||||
promise_test(async () => {
|
||||
const watcher = new ScoreWatcher;
|
||||
|
||||
// Wait for the initial render to complete.
|
||||
await waitForAnimationFrames(2);
|
||||
|
||||
assert_equals(watcher.score, 0);
|
||||
}, 'off-screen content-visibility:auto');
|
||||
|
||||
</script>
|
|
@ -1,4 +1,4 @@
|
|||
function setInnerHTML(el,content) {
|
||||
const fragment = (new DOMParser()).parseFromString(`<pre>${content}</pre>`, 'text/html', {includeShadowRoots: true});
|
||||
el.replaceChildren(...fragment.body.firstChild.childNodes);
|
||||
(el instanceof HTMLTemplateElement ? el.content : el).replaceChildren(...fragment.body.firstChild.childNodes);
|
||||
}
|
||||
|
|
|
@ -172,7 +172,7 @@ class ChromiumFormatter(base.BaseFormatter):
|
|||
to the actual status if it's not.
|
||||
|
||||
If the test has multiple statuses, it will have other statuses listed as
|
||||
"known_intermittent" in |data|. If these exist, they will be appended to
|
||||
"known_intermittent" in |data|. If these exist, they will be added to
|
||||
the returned status with spaced in between.
|
||||
|
||||
:param str actual_status: the actual status of the test
|
||||
|
@ -181,8 +181,9 @@ class ChromiumFormatter(base.BaseFormatter):
|
|||
"""
|
||||
expected_statuses = self._map_status_name(data["expected"]) if "expected" in data else actual_status
|
||||
if data.get("known_intermittent"):
|
||||
expected_statuses += " " + " ".join(
|
||||
[self._map_status_name(other_status) for other_status in data["known_intermittent"]])
|
||||
all_statsues = {self._map_status_name(other_status) for other_status in data["known_intermittent"]}
|
||||
all_statsues.add(expected_statuses)
|
||||
expected_statuses = " ".join(sorted(all_statsues))
|
||||
return expected_statuses
|
||||
|
||||
def suite_start(self, data):
|
||||
|
|
|
@ -426,8 +426,8 @@ def test_flaky_test_expected(capfd):
|
|||
test_obj = output_json["tests"]["t1"]
|
||||
# The test's statuses are all mapped, changing ERROR->FAIL and OK->PASS
|
||||
assert test_obj["actual"] == "FAIL"
|
||||
# All the possible statuses are concatenated together into expected.
|
||||
assert test_obj["expected"] == "PASS FAIL TIMEOUT"
|
||||
# All the possible statuses are merged and sorted together into expected.
|
||||
assert test_obj["expected"] == "FAIL PASS TIMEOUT"
|
||||
# ...this is not a regression or unexpected because the actual status is one
|
||||
# of the expected ones
|
||||
assert "is_regression" not in test_obj
|
||||
|
@ -462,7 +462,7 @@ def test_flaky_test_unexpected(capfd):
|
|||
test_obj = output_json["tests"]["t1"]
|
||||
# The test's statuses are all mapped, changing ERROR->FAIL and OK->PASS
|
||||
assert test_obj["actual"] == "FAIL"
|
||||
# All the possible statuses are concatenated together into expected.
|
||||
# All the possible statuses are merged and sorted together into expected.
|
||||
assert test_obj["expected"] == "PASS TIMEOUT"
|
||||
# ...this is a regression and unexpected because the actual status is not
|
||||
# one of the expected ones
|
||||
|
@ -536,6 +536,39 @@ def test_known_intermittent_empty(capfd):
|
|||
assert test_obj["expected"] == "PASS"
|
||||
|
||||
|
||||
def test_known_intermittent_duplicate(capfd):
|
||||
# We don't want to have duplicate statuses in the final "expected" field.
|
||||
|
||||
# Set up the handler.
|
||||
output = StringIO()
|
||||
logger = structuredlog.StructuredLogger("test_a")
|
||||
logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
|
||||
|
||||
# There are two duplications in this input:
|
||||
# 1. known_intermittent already contains expected;
|
||||
# 2. both statuses in known_intermittent map to FAIL in Chromium.
|
||||
# In the end, we should only get one FAIL in Chromium "expected".
|
||||
logger.suite_start(["t1"], run_info={}, time=123)
|
||||
logger.test_start("t1")
|
||||
logger.test_end("t1", status="ERROR", expected="ERROR", known_intermittent=["FAIL", "ERROR"])
|
||||
logger.suite_end()
|
||||
|
||||
# Check nothing got output to stdout/stderr.
|
||||
# (Note that mozlog outputs exceptions during handling to stderr!)
|
||||
captured = capfd.readouterr()
|
||||
assert captured.out == ""
|
||||
assert captured.err == ""
|
||||
|
||||
# Check the actual output of the formatter.
|
||||
output.seek(0)
|
||||
output_json = json.load(output)
|
||||
|
||||
test_obj = output_json["tests"]["t1"]
|
||||
assert test_obj["actual"] == "FAIL"
|
||||
# No duplicate "FAIL" in "expected".
|
||||
assert test_obj["expected"] == "FAIL"
|
||||
|
||||
|
||||
def test_reftest_screenshots(capfd):
|
||||
# reftest_screenshots, if present, should be plumbed into artifacts.
|
||||
|
||||
|
|
|
@ -9,15 +9,15 @@
|
|||
<script>
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const reader = new NDEFReader();
|
||||
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
|
||||
const ndef = new NDEFReader();
|
||||
const ndefWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
|
||||
const promise = new Promise((resolve, reject) => {
|
||||
readerWatcher.wait_for("reading").then(event => {
|
||||
ndefWatcher.wait_for("reading").then(event => {
|
||||
if (document.hidden) reject();
|
||||
else resolve();
|
||||
});
|
||||
});
|
||||
await reader.scan();
|
||||
await ndef.scan();
|
||||
await promise;
|
||||
}, "Test NDEFReader.onreading is not fired when document is hidden");
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<meta name="timeout" content="long">
|
||||
<title>NDEFWriter.write respect page visibility changes</title>
|
||||
<title>NDEFReader.write respect page visibility changes</title>
|
||||
<link rel="help" href="https://w3c.github.io/web-nfc/#visible-document">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
@ -9,7 +9,7 @@
|
|||
<script>
|
||||
|
||||
promise_test(async t => {
|
||||
const writer = new NDEFWriter();
|
||||
const writer = new NDEFReader();
|
||||
const p1 = writer.write(test_text_data);
|
||||
|
||||
return await new Promise((resolve, reject) => {
|
||||
|
@ -20,7 +20,7 @@ promise_test(async t => {
|
|||
reject();
|
||||
});
|
||||
});
|
||||
}, "Test NDEFWriter.write operation should be suspend when document is not visible");
|
||||
}, "Test NDEFReader.write operation should be suspended when document is not visible");
|
||||
|
||||
</script>
|
||||
|
|
@ -21,104 +21,136 @@ const invalid_signals = [
|
|||
];
|
||||
|
||||
function waitSyntaxErrorPromise(t, scan_options) {
|
||||
const reader = new NDEFReader();
|
||||
return promise_rejects_dom(t, 'SyntaxError', reader.scan(scan_options));
|
||||
const ndef = new NDEFReader();
|
||||
return promise_rejects_dom(t, 'SyntaxError', ndef.scan(scan_options));
|
||||
}
|
||||
|
||||
nfc_test(async t => {
|
||||
const reader = new NDEFReader();
|
||||
const ndef = new NDEFReader();
|
||||
const promises = [];
|
||||
invalid_signals.forEach(invalid_signal => {
|
||||
promises.push(promise_rejects_js(t, TypeError,
|
||||
reader.scan({ signal: invalid_signal })));
|
||||
ndef.scan({ signal: invalid_signal })));
|
||||
});
|
||||
await Promise.all(promises);
|
||||
}, "Test that NDEFReader.scan rejects if signal is not an AbortSignal.");
|
||||
|
||||
nfc_test(async t => {
|
||||
await test_driver.set_permission({ name: 'nfc' }, 'denied', false);
|
||||
const reader = new NDEFReader();
|
||||
await promise_rejects_dom(t, 'NotAllowedError', reader.scan());
|
||||
const ndef = new NDEFReader();
|
||||
await promise_rejects_dom(t, 'NotAllowedError', ndef.scan());
|
||||
}, "NDEFReader.scan should fail if user permission is not granted.");
|
||||
|
||||
// We do not provide NFC mock here to simulate that there has no available
|
||||
// implementation for NFC Mojo interface.
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
mockNFC.simulateClosedPipe();
|
||||
const reader = new NDEFReader();
|
||||
await promise_rejects_dom(t, 'NotSupportedError', reader.scan());
|
||||
}, "NDEFReader.scan should faild if no implementation for NFC Mojo interface.");
|
||||
const ndef = new NDEFReader();
|
||||
await promise_rejects_dom(t, 'NotSupportedError', ndef.scan());
|
||||
}, "NDEFReader.scan should fail if no implementation for NFC Mojo interface.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
mockNFC.setHWStatus(NFCHWStatus.DISABLED);
|
||||
const reader = new NDEFReader();
|
||||
await promise_rejects_dom(t, 'NotReadableError', reader.scan());
|
||||
const ndef = new NDEFReader();
|
||||
await promise_rejects_dom(t, 'NotReadableError', ndef.scan());
|
||||
}, "NDEFReader.scan should fail if NFC HW is disabled.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
mockNFC.setHWStatus(NFCHWStatus.NOT_SUPPORTED);
|
||||
const reader = new NDEFReader();
|
||||
await promise_rejects_dom(t, 'NotSupportedError', reader.scan());
|
||||
const ndef = new NDEFReader();
|
||||
await promise_rejects_dom(t, 'NotSupportedError', ndef.scan());
|
||||
}, "NDEFReader.scan should fail if NFC HW is not supported.");
|
||||
|
||||
nfc_test(async () => {
|
||||
await new Promise((resolve,reject) => {
|
||||
const iframe = document.createElement('iframe');
|
||||
iframe.srcdoc = `<script>
|
||||
window.onmessage = async (message) => {
|
||||
if (message.data === "Ready") {
|
||||
try {
|
||||
const ndef = new NDEFReader();
|
||||
await ndef.scan();
|
||||
parent.postMessage("Failure", "*");
|
||||
} catch (error) {
|
||||
if (error.name == "NotAllowedError") {
|
||||
parent.postMessage("Success", "*");
|
||||
} else {
|
||||
parent.postMessage("Failure", "*");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
<\/script>`;
|
||||
iframe.onload = () => iframe.contentWindow.postMessage('Ready', '*');
|
||||
document.body.appendChild(iframe);
|
||||
window.onmessage = message => {
|
||||
if (message.data == 'Success') {
|
||||
resolve();
|
||||
} else if (message.data == 'Failure') {
|
||||
reject();
|
||||
}
|
||||
}
|
||||
});
|
||||
}, 'Test that WebNFC API is not accessible from iframe context.');
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const reader = new NDEFReader();
|
||||
const ndef = new NDEFReader();
|
||||
const controller = new AbortController();
|
||||
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
|
||||
const promise = readerWatcher.wait_for("reading").then(event => {
|
||||
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
|
||||
const promise = ndefWatcher.wait_for("reading").then(event => {
|
||||
assert_true(event instanceof NDEFReadingEvent);
|
||||
controller.abort();
|
||||
});
|
||||
await reader.scan({signal : controller.signal});
|
||||
await ndef.scan({signal : controller.signal});
|
||||
|
||||
mockNFC.setReadingMessage(createMessage([createTextRecord(test_text_data)]));
|
||||
await promise;
|
||||
}, "Test that nfc watch success if NFC HW is enabled.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const reader = new NDEFReader();
|
||||
const ndef = new NDEFReader();
|
||||
const controller = new AbortController();
|
||||
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
|
||||
const promise = readerWatcher.wait_for("reading").then(event => {
|
||||
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
|
||||
const promise = ndefWatcher.wait_for("reading").then(event => {
|
||||
assert_true(event instanceof NDEFReadingEvent);
|
||||
controller.abort();
|
||||
});
|
||||
await reader.scan({signal : controller.signal});
|
||||
await ndef.scan({signal : controller.signal});
|
||||
|
||||
mockNFC.setReadingMessage(createMessage([createTextRecord(test_text_data)]));
|
||||
await promise;
|
||||
}, "Test that NDEFReader.scan matches any ids if NDEFScanOptions.id is undefined.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const reader = new NDEFReader();
|
||||
const ndef = new NDEFReader();
|
||||
const controller = new AbortController();
|
||||
controller.abort();
|
||||
await promise_rejects_dom(t, 'AbortError', reader.scan({signal: controller.signal}));
|
||||
await promise_rejects_dom(t, 'AbortError', ndef.scan({signal: controller.signal}));
|
||||
}, "Test that NDEFReader.scan rejects if NDEFScanOptions.signal is already aborted.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const reader = new NDEFReader();
|
||||
const ndef = new NDEFReader();
|
||||
const controller = new AbortController();
|
||||
const promise = reader.scan({signal: controller.signal});
|
||||
const promise = ndef.scan({signal: controller.signal});
|
||||
controller.abort();
|
||||
await promise_rejects_dom(t, 'AbortError', promise);
|
||||
}, "Test that NDEFReader.scan rejects if NDEFScanOptions.signal aborts right after \
|
||||
the scan invocation.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const reader = new NDEFReader();
|
||||
const ndef = new NDEFReader();
|
||||
const controller = new AbortController();
|
||||
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
|
||||
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
|
||||
const message = createMessage([createTextRecord(test_text_data)]);
|
||||
const promise = readerWatcher.wait_for("reading").then(event => {
|
||||
const promise = ndefWatcher.wait_for("reading").then(event => {
|
||||
assert_true(event instanceof NDEFReadingEvent);
|
||||
});
|
||||
await reader.scan({signal : controller.signal});
|
||||
await ndef.scan({signal : controller.signal});
|
||||
|
||||
mockNFC.setReadingMessage(message);
|
||||
await promise;
|
||||
|
||||
reader.onreading = t.unreached_func("reading event should not be fired.");
|
||||
ndef.onreading = t.unreached_func("reading event should not be fired.");
|
||||
mockNFC.setReadingMessage(message);
|
||||
controller.abort();
|
||||
await new Promise((resolve, reject) => {
|
||||
|
@ -127,10 +159,10 @@ nfc_test(async (t, mockNFC) => {
|
|||
}, "Test that NDEFReader can not get any reading events once the signal aborts.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const reader = new NDEFReader();
|
||||
const ndef = new NDEFReader();
|
||||
const controller = new AbortController();
|
||||
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
|
||||
const promise = readerWatcher.wait_for("reading").then(event => {
|
||||
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
|
||||
const promise = ndefWatcher.wait_for("reading").then(event => {
|
||||
controller.abort();
|
||||
assert_true(event instanceof NDEFReadingEvent);
|
||||
|
||||
|
@ -151,7 +183,7 @@ nfc_test(async (t, mockNFC) => {
|
|||
assert_equals(decoder.decode(event.message.records[0].toRecords()[0].toRecords()[0].data),
|
||||
test_text_data, 'data has the same content with the original dictionary');
|
||||
});
|
||||
await reader.scan({signal : controller.signal});
|
||||
await ndef.scan({signal : controller.signal});
|
||||
|
||||
// An external type record --contains-> a local type record --contains-> a text record.
|
||||
const messageContainText = createMessage([createTextRecord(test_text_data)]);
|
||||
|
@ -164,10 +196,10 @@ nfc_test(async (t, mockNFC) => {
|
|||
}, "NDEFRecord.toRecords returns its embedded records correctly.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const reader = new NDEFReader();
|
||||
const ndef = new NDEFReader();
|
||||
const controller = new AbortController();
|
||||
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
|
||||
const promise = readerWatcher.wait_for("reading").then(event => {
|
||||
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
|
||||
const promise = ndefWatcher.wait_for("reading").then(event => {
|
||||
controller.abort();
|
||||
assert_true(event instanceof NDEFReadingEvent);
|
||||
|
||||
|
@ -203,7 +235,7 @@ nfc_test(async (t, mockNFC) => {
|
|||
assert_array_equals(embedded_record_types.sort(), ['text', 'url'],
|
||||
'smart-poster record\'s contained record types');
|
||||
});
|
||||
await reader.scan({signal : controller.signal});
|
||||
await ndef.scan({signal : controller.signal});
|
||||
|
||||
// A smart-poster record contains a uri record, text record.
|
||||
const uri_record = createUrlRecord(test_url_data);
|
||||
|
@ -218,17 +250,17 @@ nfc_test(async (t, mockNFC) => {
|
|||
nfc_test(async (t, mockNFC) => {
|
||||
const promises = [];
|
||||
|
||||
const reader1 = new NDEFReader();
|
||||
const readerWatcher1 = new EventWatcher(t, reader1, ["reading", "readingerror"]);
|
||||
const promise1 = readerWatcher1.wait_for("readingerror");
|
||||
const ndef1 = new NDEFReader();
|
||||
const ndefWatcher1 = new EventWatcher(t, ndef1, ["reading", "readingerror"]);
|
||||
const promise1 = ndefWatcher1.wait_for("readingerror");
|
||||
promises.push(promise1);
|
||||
await reader1.scan();
|
||||
await ndef1.scan();
|
||||
|
||||
const reader2 = new NDEFReader();
|
||||
const readerWatcher2 = new EventWatcher(t, reader2, ["reading", "readingerror"]);
|
||||
const promise2 = readerWatcher2.wait_for("readingerror");
|
||||
const ndef2 = new NDEFReader();
|
||||
const ndefWatcher2 = new EventWatcher(t, ndef2, ["reading", "readingerror"]);
|
||||
const promise2 = ndefWatcher2.wait_for("readingerror");
|
||||
promises.push(promise2);
|
||||
await reader2.scan();
|
||||
await ndef2.scan();
|
||||
|
||||
mockNFC.simulateNonNDEFTagDiscovered();
|
||||
await Promise.all(promises);
|
||||
|
@ -236,15 +268,15 @@ nfc_test(async (t, mockNFC) => {
|
|||
expose NDEF technology.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const reader = new NDEFReader();
|
||||
const ndef = new NDEFReader();
|
||||
const controller = new AbortController();
|
||||
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
|
||||
const promise = readerWatcher.wait_for("reading").then(event => {
|
||||
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
|
||||
const promise = ndefWatcher.wait_for("reading").then(event => {
|
||||
assert_equals(event.serialNumber, fake_tag_serial_number);
|
||||
assert_equals(event.message.records.length, 0);
|
||||
controller.abort();
|
||||
});
|
||||
await reader.scan({signal : controller.signal});
|
||||
await ndef.scan({signal : controller.signal});
|
||||
|
||||
mockNFC.setReadingMessage({ records: [] });
|
||||
await promise;
|
||||
|
@ -252,7 +284,7 @@ nfc_test(async (t, mockNFC) => {
|
|||
with empty records array for NDEFMessage.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const reader = new NDEFReader();
|
||||
const ndef = new NDEFReader();
|
||||
const controller = new AbortController();
|
||||
const message = createMessage([createTextRecord(test_text_data),
|
||||
createMimeRecordFromJson(test_json_data),
|
||||
|
@ -262,31 +294,31 @@ nfc_test(async (t, mockNFC) => {
|
|||
createUrlRecord(test_url_data, true),
|
||||
createRecord('w3.org:xyz', test_buffer_data)],
|
||||
test_message_origin);
|
||||
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
|
||||
const promise = readerWatcher.wait_for("reading").then(event => {
|
||||
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
|
||||
const promise = ndefWatcher.wait_for("reading").then(event => {
|
||||
assert_equals(event.serialNumber, fake_tag_serial_number);
|
||||
assertWebNDEFMessagesEqual(event.message, new NDEFMessage(message));
|
||||
controller.abort();
|
||||
});
|
||||
await reader.scan({signal : controller.signal});
|
||||
await ndef.scan({signal : controller.signal});
|
||||
|
||||
mockNFC.setReadingMessage(message);
|
||||
await promise;
|
||||
}, "Test that reading message with multiple records should succeed.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const reader = new NDEFReader();
|
||||
const promise1 = reader.scan();
|
||||
const promise2 = promise_rejects_dom(t, 'InvalidStateError', reader.scan());
|
||||
const ndef = new NDEFReader();
|
||||
const promise1 = ndef.scan();
|
||||
const promise2 = promise_rejects_dom(t, 'InvalidStateError', ndef.scan());
|
||||
await promise1;
|
||||
await promise2;
|
||||
}, "Test that NDEFReader.scan rejects if there is already an ongoing scan.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const reader = new NDEFReader();
|
||||
const ndef = new NDEFReader();
|
||||
const controller = new AbortController();
|
||||
await reader.scan({signal : controller.signal});
|
||||
await ndef.scan({signal : controller.signal});
|
||||
controller.abort();
|
||||
await reader.scan();
|
||||
await ndef.scan();
|
||||
}, "Test that NDEFReader.scan can be started after the previous scan is aborted.");
|
||||
</script>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<title>NDEFWriter.scan with an focused iframe</title>
|
||||
<title>NDEFReader.scan with an focused iframe</title>
|
||||
<link rel="help" href="https://w3c.github.io/web-nfc/"/>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
@ -9,15 +9,15 @@
|
|||
<script>
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const reader = new NDEFReader();
|
||||
const ndef = new NDEFReader();
|
||||
const controller = new AbortController();
|
||||
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
|
||||
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
|
||||
|
||||
const promise = readerWatcher.wait_for("reading").then(event => {
|
||||
const promise = ndefWatcher.wait_for("reading").then(event => {
|
||||
assert_true(event instanceof NDEFReadingEvent);
|
||||
controller.abort();
|
||||
});
|
||||
await reader.scan({ signal: controller.signal });
|
||||
await ndef.scan({ signal: controller.signal });
|
||||
|
||||
const iframe = document.createElement('iframe');
|
||||
iframe.src = 'resources/support-iframe.html';
|
||||
|
@ -37,7 +37,7 @@ nfc_test(async (t, mockNFC) => {
|
|||
|
||||
// Remove iframe from main document.
|
||||
iframe.parentNode.removeChild(iframe);
|
||||
}, 'Test that NDEFWriter.scan is not suspended if iframe gains focus.');
|
||||
}, 'Test that NDEFReader.scan is not suspended if iframe gains focus.');
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset=utf-8>
|
||||
<title>Web NFC: NDEFWriter.write Tests</title>
|
||||
<title>Web NFC: NDEFReader.write Tests</title>
|
||||
<link rel="author" title="Intel" href="http://www.intel.com"/>
|
||||
<link rel="help" href="https://w3c.github.io/web-nfc/"/>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
|
@ -124,21 +124,21 @@ const invalid_signals = [
|
|||
];
|
||||
|
||||
nfc_test(async t => {
|
||||
const writer = new NDEFWriter();
|
||||
const ndef = new NDEFReader();
|
||||
const promises = [];
|
||||
invalid_type_messages.forEach(message => {
|
||||
promises.push(
|
||||
promise_rejects_js(t, TypeError, writer.write(message)));
|
||||
promise_rejects_js(t, TypeError, ndef.write(message)));
|
||||
});
|
||||
await Promise.all(promises);
|
||||
}, "Test that promise is rejected with TypeError if NDEFMessageSource is invalid.");
|
||||
|
||||
nfc_test(async t => {
|
||||
const writer = new NDEFWriter();
|
||||
const ndef = new NDEFReader();
|
||||
const promises = [];
|
||||
invalid_syntax_messages.forEach(message => {
|
||||
promises.push(
|
||||
promise_rejects_dom(t, 'SyntaxError', writer.write(message)));
|
||||
promise_rejects_dom(t, 'SyntaxError', ndef.write(message)));
|
||||
});
|
||||
await Promise.all(promises);
|
||||
}, "Test that promise is rejected with SyntaxError if NDEFMessageSource contains\
|
||||
|
@ -146,25 +146,25 @@ nfc_test(async t => {
|
|||
|
||||
nfc_test(async t => {
|
||||
await test_driver.set_permission({ name: 'nfc' }, 'denied', false);
|
||||
const writer = new NDEFWriter();
|
||||
await promise_rejects_dom(t, 'NotAllowedError', writer.write(test_text_data));
|
||||
}, 'NDEFWriter.write should fail if user permission is not granted.');
|
||||
const ndef = new NDEFReader();
|
||||
await promise_rejects_dom(t, 'NotAllowedError', ndef.write(test_text_data));
|
||||
}, 'NDEFReader.write should fail if user permission is not granted.');
|
||||
|
||||
// We do not provide NFC mock here to simulate that there has no available
|
||||
// implementation for NFC Mojo interface.
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
mockNFC.simulateClosedPipe();
|
||||
const writer = new NDEFWriter();
|
||||
await promise_rejects_dom(t, 'NotSupportedError', writer.write(test_text_data));
|
||||
}, 'NDEFWriter.write should fail if no implementation for NFC Mojo interface is available.');
|
||||
const ndef = new NDEFReader();
|
||||
await promise_rejects_dom(t, 'NotSupportedError', ndef.write(test_text_data));
|
||||
}, 'NDEFReader.write should fail if no implementation for NFC Mojo interface is available.');
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const writer = new NDEFWriter();
|
||||
const ndef = new NDEFReader();
|
||||
const controller = new AbortController();
|
||||
|
||||
//Make sure push is pending
|
||||
mockNFC.setPendingPushCompleted(false);
|
||||
const p = writer.write(test_text_data, { signal: controller.signal });
|
||||
const p = ndef.write(test_text_data, { signal: controller.signal });
|
||||
const rejected = promise_rejects_dom(t, 'AbortError', p);
|
||||
let callback_called = false;
|
||||
await new Promise(resolve => {
|
||||
|
@ -176,76 +176,71 @@ nfc_test(async (t, mockNFC) => {
|
|||
});
|
||||
await rejected;
|
||||
assert_true(callback_called, 'timeout should have caused the abort');
|
||||
}, "NDEFWriter.write should fail if abort write request before write happends.");
|
||||
}, "NDEFReader.write should fail if abort write request before write happends.");
|
||||
|
||||
nfc_test(async t => {
|
||||
const writer = new NDEFWriter();
|
||||
const ndef = new NDEFReader();
|
||||
const controller = new AbortController();
|
||||
assert_false(controller.signal.aborted);
|
||||
controller.abort();
|
||||
assert_true(controller.signal.aborted);
|
||||
await promise_rejects_dom(t, 'AbortError',
|
||||
writer.write(test_text_data, { signal: controller.signal }));
|
||||
}, "NDEFWriter.write should fail if signal's aborted flag is set.");
|
||||
ndef.write(test_text_data, { signal: controller.signal }));
|
||||
}, "NDEFReader.write should fail if signal's aborted flag is set.");
|
||||
|
||||
nfc_test(async t => {
|
||||
const writer = new NDEFWriter();
|
||||
const ndef = new NDEFReader();
|
||||
const promises = [];
|
||||
invalid_signals.forEach(invalid_signal => {
|
||||
promises.push(promise_rejects_js(t, TypeError,
|
||||
writer.write(test_text_data, { signal: invalid_signal })));
|
||||
ndef.write(test_text_data, { signal: invalid_signal })));
|
||||
});
|
||||
await Promise.all(promises);
|
||||
}, "NDEFWriter.write should fail if signal is not an AbortSignal.");
|
||||
}, "NDEFReader.write should fail if signal is not an AbortSignal.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const writer1 = new NDEFWriter();
|
||||
const writer2 = new NDEFWriter();
|
||||
const ndef1 = new NDEFReader();
|
||||
const ndef2 = new NDEFReader();
|
||||
const controller = new AbortController();
|
||||
const p1 = writer1.write(test_text_data, { signal: controller.signal });
|
||||
const p1 = ndef1.write(test_text_data, { signal: controller.signal });
|
||||
|
||||
// Even though write request is grantable,
|
||||
// this abort should be processed synchronously.
|
||||
controller.abort();
|
||||
await promise_rejects_dom(t, 'AbortError', p1);
|
||||
|
||||
await writer2.write(test_text_data);
|
||||
await ndef2.write(test_text_data);
|
||||
assertNDEFMessagesEqual(test_text_data, mockNFC.pushedMessage());
|
||||
}, "Synchronously signaled abort.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const writer = new NDEFWriter();
|
||||
const ndef = new NDEFReader();
|
||||
mockNFC.setHWStatus(NFCHWStatus.DISABLED);
|
||||
await promise_rejects_dom(t, 'NotReadableError', writer.write(test_text_data));
|
||||
}, "NDEFWriter.write should fail when NFC HW is disabled.");
|
||||
await promise_rejects_dom(t, 'NotReadableError', ndef.write(test_text_data));
|
||||
}, "NDEFReader.write should fail when NFC HW is disabled.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const writer = new NDEFWriter();
|
||||
const ndef = new NDEFReader();
|
||||
mockNFC.setHWStatus(NFCHWStatus.NOT_SUPPORTED);
|
||||
await promise_rejects_dom(t, 'NotSupportedError', writer.write(test_text_data));
|
||||
}, "NDEFWriter.write should fail when NFC HW is not supported.");
|
||||
await promise_rejects_dom(t, 'NotSupportedError', ndef.write(test_text_data));
|
||||
}, "NDEFReader.write should fail when NFC HW is not supported.");
|
||||
|
||||
nfc_test(async () => {
|
||||
await new Promise((resolve,reject) => {
|
||||
const iframe = document.createElement('iframe');
|
||||
iframe.srcdoc = `<script>
|
||||
window.onmessage = message => {
|
||||
window.onmessage = async (message) => {
|
||||
if (message.data === "Ready") {
|
||||
const onSuccess = () => {
|
||||
try {
|
||||
const ndef = new NDEFReader();
|
||||
await ndef.write("Test");
|
||||
parent.postMessage("Failure", "*");
|
||||
};
|
||||
const onError = error => {
|
||||
} catch (error) {
|
||||
if (error.name == "NotAllowedError") {
|
||||
parent.postMessage("Success", "*");
|
||||
} else {
|
||||
parent.postMessage("Failure", "*");
|
||||
}
|
||||
};
|
||||
try {
|
||||
const writer = new NDEFWriter();
|
||||
writer.write("Test").then(onSuccess, onError);
|
||||
} catch(e) {
|
||||
parent.postMessage("Failure", "*");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -263,12 +258,12 @@ nfc_test(async () => {
|
|||
}, 'Test that WebNFC API is not accessible from iframe context.');
|
||||
|
||||
nfc_test(async () => {
|
||||
const writer = new NDEFWriter();
|
||||
await writer.write(test_text_data);
|
||||
}, 'NDEFWriter.write should succeed when NFC HW is enabled');
|
||||
const ndef = new NDEFReader();
|
||||
await ndef.write(test_text_data);
|
||||
}, 'NDEFReader.write should succeed when NFC HW is enabled');
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const writer = new NDEFWriter();
|
||||
const ndef = new NDEFReader();
|
||||
const message = createMessage([createTextRecord(test_text_data),
|
||||
createMimeRecordFromJson(test_json_data),
|
||||
createMimeRecord(test_buffer_data),
|
||||
|
@ -277,9 +272,9 @@ nfc_test(async (t, mockNFC) => {
|
|||
createUrlRecord(test_url_data, true),
|
||||
createRecord('w3.org:xyz', test_buffer_data)],
|
||||
test_message_origin);
|
||||
await writer.write(message);
|
||||
await ndef.write(message);
|
||||
assertNDEFMessagesEqual(message, mockNFC.pushedMessage());
|
||||
}, "NDEFWriter.write NDEFMessage containing text, mime, unknown, url, absolute-url \
|
||||
}, "NDEFReader.write NDEFMessage containing text, mime, unknown, url, absolute-url \
|
||||
and external records with default NDEFWriteOptions.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
|
@ -291,8 +286,8 @@ nfc_test(async (t, mockNFC) => {
|
|||
// Prepare an external type record that uses |messageContainLocal| as its payload.
|
||||
const message = createMessage([createRecord('example.com:containsLocalRecord', messageContainLocal)]);
|
||||
|
||||
const writer = new NDEFWriter();
|
||||
await writer.write(message);
|
||||
const ndef = new NDEFReader();
|
||||
await ndef.write(message);
|
||||
const pushed_message = mockNFC.pushedMessage();
|
||||
|
||||
// The mojom message received by mock nfc contains only the external type record.
|
||||
|
@ -311,7 +306,7 @@ nfc_test(async (t, mockNFC) => {
|
|||
assert_array_equals(pushed_message.data[0].payloadMessage.data[0].data, new Uint8Array(0),
|
||||
'payloadMessage is used instead');
|
||||
assertNDEFMessagesEqual(messageContainText, pushed_message.data[0].payloadMessage.data[0].payloadMessage);
|
||||
}, "NDEFWriter.write NDEFMessage containing embedded records.");
|
||||
}, "NDEFReader.write NDEFMessage containing embedded records.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
// A smart-poster record contains a uri record, text record.
|
||||
|
@ -321,8 +316,8 @@ nfc_test(async (t, mockNFC) => {
|
|||
const message = createMessage([createRecord(
|
||||
'smart-poster', payload_message, "dummy_record_id")]);
|
||||
|
||||
const writer = new NDEFWriter();
|
||||
await writer.write(message);
|
||||
const ndef = new NDEFReader();
|
||||
await ndef.write(message);
|
||||
const pushed_message = mockNFC.pushedMessage();
|
||||
|
||||
// The mojom message received by mock nfc contains only the smart-poster record.
|
||||
|
@ -350,53 +345,53 @@ nfc_test(async (t, mockNFC) => {
|
|||
}
|
||||
assert_array_equals(embedded_record_types.sort(), ['text', 'url'],
|
||||
'smart-poster record\'s contained record types');
|
||||
}, "NDEFWriter.write NDEFMessage containing smart-poster record.");
|
||||
}, "NDEFReader.write NDEFMessage containing smart-poster record.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const writer = new NDEFWriter();
|
||||
await writer.write(test_text_data);
|
||||
const ndef = new NDEFReader();
|
||||
await ndef.write(test_text_data);
|
||||
assertNDEFMessagesEqual(test_text_data, mockNFC.pushedMessage());
|
||||
}, "Test that NDEFWriter.write succeeds when message is DOMString.");
|
||||
}, "Test that NDEFReader.write succeeds when message is DOMString.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const writer = new NDEFWriter();
|
||||
await writer.write(test_buffer_data);
|
||||
const ndef = new NDEFReader();
|
||||
await ndef.write(test_buffer_data);
|
||||
assertNDEFMessagesEqual(test_buffer_data, mockNFC.pushedMessage());
|
||||
}, "Test that NDEFWriter.write succeeds when message is ArrayBuffer.");
|
||||
}, "Test that NDEFReader.write succeeds when message is ArrayBuffer.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
let buffer_view = new Uint8Array(test_buffer_data, 2, 5);
|
||||
const writer = new NDEFWriter();
|
||||
await writer.write(buffer_view);
|
||||
const ndef = new NDEFReader();
|
||||
await ndef.write(buffer_view);
|
||||
assertNDEFMessagesEqual(buffer_view, mockNFC.pushedMessage());
|
||||
}, "Test that NDEFWriter.write succeeds when message is ArrayBufferView.");
|
||||
}, "Test that NDEFReader.write succeeds when message is ArrayBufferView.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const writer = new NDEFWriter();
|
||||
await writer.write(createMessage([createRecord('empty')]));
|
||||
const ndef = new NDEFReader();
|
||||
await ndef.write(createMessage([createRecord('empty')]));
|
||||
const receivedMessage = mockNFC.pushedMessage();
|
||||
assert_equals(receivedMessage.data.length, 1);
|
||||
assert_equals(receivedMessage.data[0].recordType, 'empty', 'recordType');
|
||||
}, "NDEFWriter.write with 'empty' record should succeed.");
|
||||
}, "NDEFReader.write with 'empty' record should succeed.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const writer = new NDEFWriter();
|
||||
await writer.write(test_text_data);
|
||||
const ndef = new NDEFReader();
|
||||
await ndef.write(test_text_data);
|
||||
assertNDEFWriteOptionsEqual({overwrite: true}, mockNFC.writeOptions());
|
||||
}, "Check that default NDEFWriteOptions values are correctly set.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const writer = new NDEFWriter();
|
||||
await writer.write(test_text_data, {overwrite: false});
|
||||
const ndef = new NDEFReader();
|
||||
await ndef.write(test_text_data, {overwrite: false});
|
||||
assertNDEFWriteOptionsEqual({overwrite: false}, mockNFC.writeOptions());
|
||||
}, "Check that provided NDEFWriteOptions values are correctly converted.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const writer1 = new NDEFWriter();
|
||||
const writer2 = new NDEFWriter();
|
||||
const ndef1 = new NDEFReader();
|
||||
const ndef2 = new NDEFReader();
|
||||
|
||||
const p1 = writer1.write(test_text_data, {overwrite: false});
|
||||
const p2 = writer2.write(test_url_data, {overwrite: true});
|
||||
const p1 = ndef1.write(test_text_data, {overwrite: false});
|
||||
const p2 = ndef2.write(test_url_data, {overwrite: true});
|
||||
|
||||
await new Promise((resolve, reject) => {
|
||||
// Make first push pending
|
||||
|
@ -414,11 +409,11 @@ nfc_test(async (t, mockNFC) => {
|
|||
resolve();
|
||||
});
|
||||
});
|
||||
}, "NDEFWriter.write should replace all previously configured write operations.");
|
||||
}, "NDEFReader.write should replace all previously configured write operations.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const writer = new NDEFWriter();
|
||||
await writer.write({ records: [{ recordType: "mime", data: test_buffer_data }] });
|
||||
const ndef = new NDEFReader();
|
||||
await ndef.write({ records: [{ recordType: "mime", data: test_buffer_data }] });
|
||||
assertNDEFMessagesEqual(test_buffer_data, mockNFC.pushedMessage());
|
||||
}, "Test that mediaType should be set to 'application/octet-stream' if \
|
||||
NDEFRecordInit.record's recordType is 'mime' and NDEFRecordInit.record's \
|
||||
|
@ -428,46 +423,46 @@ nfc_test(async (t, mockNFC) => {
|
|||
// Make sure the push will be pending in the mock.
|
||||
mockNFC.setPendingPushCompleted(false);
|
||||
|
||||
const writer = new NDEFWriter();
|
||||
const promise = writer.write(test_text_data);
|
||||
const ndef1 = new NDEFReader();
|
||||
const promise = ndef1.write(test_text_data);
|
||||
|
||||
// Just to make sure the write() request has already reached to the mock.
|
||||
const reader = new NDEFReader();
|
||||
await reader.scan();
|
||||
const ndef2 = new NDEFReader();
|
||||
await ndef2.scan();
|
||||
|
||||
mockNFC.simulateNonNDEFTagDiscovered();
|
||||
await promise_rejects_dom(t, 'NotSupportedError', promise);
|
||||
}, "NDEFWriter.write should fail when the NFC device coming up does not expose \
|
||||
}, "NDEFReader.write should fail when the NFC device coming up does not expose \
|
||||
NDEF technology.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const writer = new NDEFWriter();
|
||||
await writer.write(test_text_data, {overwrite: false});
|
||||
const ndef = new NDEFReader();
|
||||
await ndef.write(test_text_data, {overwrite: false});
|
||||
assertNDEFMessagesEqual(test_text_data, mockNFC.pushedMessage());
|
||||
}, "NDEFWriter.write should succeed to write data to an unformatted NFC device \
|
||||
}, "NDEFReader.write should succeed to write data to an unformatted NFC device \
|
||||
when the NDEFWriteOptions.overwrite is false.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const writer = new NDEFWriter();
|
||||
await writer.write(test_buffer_data);
|
||||
const ndef = new NDEFReader();
|
||||
await ndef.write(test_buffer_data);
|
||||
assertNDEFMessagesEqual(test_buffer_data, mockNFC.pushedMessage());
|
||||
await writer.write(test_text_data, {overwrite: true});
|
||||
await ndef.write(test_text_data, {overwrite: true});
|
||||
assertNDEFMessagesEqual(test_text_data, mockNFC.pushedMessage());
|
||||
}, "NDEFWriter.write should succeed to overwrite the existing data \
|
||||
}, "NDEFReader.write should succeed to overwrite the existing data \
|
||||
when the NDEFWriteOptions.overwrite is true.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const writer = new NDEFWriter();
|
||||
const p = writer.write(test_text_data, {overwrite: false});
|
||||
const ndef = new NDEFReader();
|
||||
const p = ndef.write(test_text_data, {overwrite: false});
|
||||
mockNFC.setIsFormattedTag(true);
|
||||
await promise_rejects_dom(t, 'NotAllowedError', p);
|
||||
}, "NDEFWriter.write should fail when there are NDEF records on the NFC device \
|
||||
}, "NDEFReader.write should fail when there are NDEF records on the NFC device \
|
||||
and NDEFWriteOptions.overwrite is false.");
|
||||
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const writer = new NDEFWriter();
|
||||
const ndef = new NDEFReader();
|
||||
mockNFC.simulateDataTransferFails();
|
||||
await promise_rejects_dom(t, 'NetworkError', writer.write(test_text_data));
|
||||
}, "NDEFWriter.write should fail with NetworkError when NFC data transfer fails.");
|
||||
await promise_rejects_dom(t, 'NetworkError', ndef.write(test_text_data));
|
||||
}, "NDEFReader.write should fail with NetworkError when NFC data transfer fails.");
|
||||
|
||||
</script>
|
|
@ -15,11 +15,6 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
test(t => {
|
||||
assert_false(isSecureContext);
|
||||
assert_false('NDEFWriter' in window);
|
||||
}, 'NDEFWriter requires a secure context');
|
||||
|
||||
test(t => {
|
||||
assert_false(isSecureContext);
|
||||
assert_false('NDEFReader' in window);
|
||||
|
|
|
@ -150,7 +150,7 @@ function createUrlRecord(url, isAbsUrl) {
|
|||
}
|
||||
|
||||
// Compares NDEFMessageSource that was provided to the API
|
||||
// (e.g. NDEFWriter.write), and NDEFMessage that was received by the
|
||||
// (e.g. NDEFReader.write), and NDEFMessage that was received by the
|
||||
// mock NFC service.
|
||||
function assertNDEFMessagesEqual(providedMessage, receivedMessage) {
|
||||
// If simple data type is passed, e.g. String or ArrayBuffer or
|
||||
|
@ -174,7 +174,7 @@ function assertNDEFMessagesEqual(providedMessage, receivedMessage) {
|
|||
}
|
||||
|
||||
// Used to compare two NDEFMessage, one that is received from
|
||||
// NDEFWriter.onreading() EventHandler and another that is provided to mock NFC
|
||||
// NDEFReader.onreading() EventHandler and another that is provided to mock NFC
|
||||
// service.
|
||||
function assertWebNDEFMessagesEqual(message, expectedMessage) {
|
||||
assert_equals(message.records.length, expectedMessage.records.length);
|
||||
|
@ -195,22 +195,22 @@ function assertWebNDEFMessagesEqual(message, expectedMessage) {
|
|||
|
||||
function testMultiScanOptions(message, scanOptions, unmatchedScanOptions, desc) {
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const reader1 = new NDEFReader();
|
||||
const reader2 = new NDEFReader();
|
||||
const ndef1 = new NDEFReader();
|
||||
const ndef2 = new NDEFReader();
|
||||
const controller = new AbortController();
|
||||
|
||||
// Reading from unmatched reader will not be triggered
|
||||
reader1.onreading = t.unreached_func("reading event should not be fired.");
|
||||
// Reading from unmatched ndef will not be triggered
|
||||
ndef1.onreading = t.unreached_func("reading event should not be fired.");
|
||||
unmatchedScanOptions.signal = controller.signal;
|
||||
await reader1.scan(unmatchedScanOptions);
|
||||
await ndef1.scan(unmatchedScanOptions);
|
||||
|
||||
const readerWatcher = new EventWatcher(t, reader2, ["reading", "readingerror"]);
|
||||
const promise = readerWatcher.wait_for("reading").then(event => {
|
||||
const ndefWatcher = new EventWatcher(t, ndef2, ["reading", "readingerror"]);
|
||||
const promise = ndefWatcher.wait_for("reading").then(event => {
|
||||
controller.abort();
|
||||
assertWebNDEFMessagesEqual(event.message, new NDEFMessage(message));
|
||||
});
|
||||
scanOptions.signal = controller.signal;
|
||||
await reader2.scan(scanOptions);
|
||||
await ndef2.scan(scanOptions);
|
||||
|
||||
mockNFC.setReadingMessage(message);
|
||||
await promise;
|
||||
|
@ -219,15 +219,15 @@ function testMultiScanOptions(message, scanOptions, unmatchedScanOptions, desc)
|
|||
|
||||
function testMultiMessages(message, scanOptions, unmatchedMessage, desc) {
|
||||
nfc_test(async (t, mockNFC) => {
|
||||
const reader = new NDEFReader();
|
||||
const ndef = new NDEFReader();
|
||||
const controller = new AbortController();
|
||||
const readerWatcher = new EventWatcher(t, reader, ["reading", "readingerror"]);
|
||||
const promise = readerWatcher.wait_for("reading").then(event => {
|
||||
const ndefWatcher = new EventWatcher(t, ndef, ["reading", "readingerror"]);
|
||||
const promise = ndefWatcher.wait_for("reading").then(event => {
|
||||
controller.abort();
|
||||
assertWebNDEFMessagesEqual(event.message, new NDEFMessage(message));
|
||||
});
|
||||
scanOptions.signal = controller.signal;
|
||||
await reader.scan(scanOptions);
|
||||
await ndef.scan(scanOptions);
|
||||
|
||||
// Unmatched message will not be read
|
||||
mockNFC.setReadingMessage(unmatchedMessage);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue