Update web-platform-tests to revision 887d08e63a19b14acf3217df77f12c121a792fed

This commit is contained in:
WPT Sync Bot 2019-06-18 10:23:53 +00:00
parent 97ad913dc2
commit a41065a1f4
65 changed files with 1433 additions and 463 deletions

View file

@ -34,6 +34,3 @@
[Revoke blob URL after creating Request, will fetch]
expected: FAIL
[Revoke blob URL after calling fetch, fetch should succeed]
expected: FAIL

View file

@ -76677,6 +76677,18 @@
{}
]
],
"css/CSS2/positioning/abspos-negative-margin-001.html": [
[
"css/CSS2/positioning/abspos-negative-margin-001.html",
[
[
"/css/CSS2/positioning/abspos-negative-margin-001-ref.html",
"=="
]
],
{}
]
],
"css/CSS2/positioning/abspos-overflow-001.xht": [
[
"css/CSS2/positioning/abspos-overflow-001.xht",
@ -201401,6 +201413,42 @@
{}
]
],
"mathml/presentation-markup/operators/mo-movablelimits-default.html": [
[
"mathml/presentation-markup/operators/mo-movablelimits-default.html",
[
[
"/mathml/presentation-markup/operators/mo-movablelimits-default-ref.html",
"=="
]
],
{}
]
],
"mathml/presentation-markup/operators/mo-movablelimits-dynamic.html": [
[
"mathml/presentation-markup/operators/mo-movablelimits-dynamic.html",
[
[
"/mathml/presentation-markup/operators/mo-movablelimits-dynamic-ref.html",
"=="
]
],
{}
]
],
"mathml/presentation-markup/operators/mo-movablelimits.html": [
[
"mathml/presentation-markup/operators/mo-movablelimits.html",
[
[
"/mathml/presentation-markup/operators/mo-movablelimits-ref.html",
"=="
]
],
{}
]
],
"mathml/presentation-markup/operators/mo-paint-lspace-rspace.html": [
[
"mathml/presentation-markup/operators/mo-paint-lspace-rspace.html",
@ -201485,6 +201533,18 @@
{}
]
],
"mathml/relations/css-styling/mathsize-attribute.html": [
[
"mathml/relations/css-styling/mathsize-attribute.html",
[
[
"/mathml/relations/css-styling/mathsize-attribute-ref.html",
"=="
]
],
{}
]
],
"mathml/relations/css-styling/mathvariant-bold-fraktur.html": [
[
"mathml/relations/css-styling/mathvariant-bold-fraktur.html",
@ -201857,6 +201917,42 @@
{}
]
],
"quirks/body-fills-html-quirk-float.html": [
[
"quirks/body-fills-html-quirk-float.html",
[
[
"/quirks/body-fills-html-quirk-ref.html",
"=="
]
],
{}
]
],
"quirks/body-fills-html-quirk-inline.html": [
[
"quirks/body-fills-html-quirk-inline.html",
[
[
"/quirks/body-fills-html-quirk-ref.html",
"=="
]
],
{}
]
],
"quirks/body-fills-html-quirk-positioned.html": [
[
"quirks/body-fills-html-quirk-positioned.html",
[
[
"/quirks/body-fills-html-quirk-ref.html",
"=="
]
],
{}
]
],
"quirks/historical/list-item-bullet-size.html": [
[
"quirks/historical/list-item-bullet-size.html",
@ -201905,6 +202001,18 @@
{}
]
],
"quirks/table-cell-width-calculation-abspos.html": [
[
"quirks/table-cell-width-calculation-abspos.html",
[
[
"/quirks/reference/table-cell-width-calculation-abspos-ref.html",
"=="
]
],
{}
]
],
"quirks/text-decoration-doesnt-propagate-into-tables/quirks.html": [
[
"quirks/text-decoration-doesnt-propagate-into-tables/quirks.html",
@ -233980,6 +234088,9 @@
"css/CSS2/positioning/abspos-inline-007-ref.xht": [
[]
],
"css/CSS2/positioning/abspos-negative-margin-001-ref.html": [
[]
],
"css/CSS2/positioning/abspos-overflow-001-ref.xht": [
[]
],
@ -248050,6 +248161,9 @@
"css/css-lists/add-inline-child-after-marker-001-ref.html": [
[]
],
"css/css-lists/change-list-style-type-ref.html": [
[]
],
"css/css-lists/content-property/marker-text-matches-armenian-ref.html": [
[]
],
@ -270760,6 +270874,15 @@
"mathml/presentation-markup/operators/mo-form-ref.html": [
[]
],
"mathml/presentation-markup/operators/mo-movablelimits-default-ref.html": [
[]
],
"mathml/presentation-markup/operators/mo-movablelimits-dynamic-ref.html": [
[]
],
"mathml/presentation-markup/operators/mo-movablelimits-ref.html": [
[]
],
"mathml/presentation-markup/operators/mo-paint-lspace-rspace-ref.html": [
[]
],
@ -270781,6 +270904,9 @@
"mathml/relations/css-styling/lengths-1-ref.html": [
[]
],
"mathml/relations/css-styling/mathsize-attribute-ref.html": [
[]
],
"mathml/relations/css-styling/mathvariant-bold-fraktur-ref.html": [
[]
],
@ -272485,6 +272611,9 @@
"quirks/META.yml": [
[]
],
"quirks/body-fills-html-quirk-ref.html": [
[]
],
"quirks/hashless-hex-color/support/common.js": [
[]
],
@ -272500,6 +272629,9 @@
"quirks/reference/green-100px-square-no-red.html": [
[]
],
"quirks/reference/table-cell-width-calculation-abspos-ref.html": [
[]
],
"quirks/support/test-ref-iframe.js": [
[]
],
@ -312768,6 +312900,12 @@
{}
]
],
"css/css-position/position-absolute-chrome-bug-002.html": [
[
"css/css-position/position-absolute-chrome-bug-002.html",
{}
]
],
"css/css-position/position-absolute-container-dynamic-002.html": [
[
"css/css-position/position-absolute-container-dynamic-002.html",
@ -316812,6 +316950,12 @@
{}
]
],
"css/css-text/white-space/append-whitespace-only-node-crash-001.html": [
[
"css/css-text/white-space/append-whitespace-only-node-crash-001.html",
{}
]
],
"css/css-text/white-space/nowrap-wbr-and-space-crash.html": [
[
"css/css-text/white-space/nowrap-wbr-and-space-crash.html",
@ -320936,6 +321080,12 @@
{}
]
],
"css/cssom-view/elementFromPoint-subpixel.html": [
[
"css/cssom-view/elementFromPoint-subpixel.html",
{}
]
],
"css/cssom-view/elementFromPoint.html": [
[
"css/cssom-view/elementFromPoint.html",
@ -321694,6 +321844,12 @@
{}
]
],
"css/cssom/cssstyledeclaration-setter-form-controls.html": [
[
"css/cssom/cssstyledeclaration-setter-form-controls.html",
{}
]
],
"css/cssom/cssstyledeclaration-setter-logical.html": [
[
"css/cssom/cssstyledeclaration-setter-logical.html",
@ -351264,6 +351420,12 @@
{}
]
],
"html/semantics/scripting-1/the-script-element/module/inactive-context-import.html": [
[
"html/semantics/scripting-1/the-script-element/module/inactive-context-import.html",
{}
]
],
"html/semantics/scripting-1/the-script-element/module/inline-async-execorder.html": [
[
"html/semantics/scripting-1/the-script-element/module/inline-async-execorder.html",
@ -387178,30 +387340,6 @@
{}
]
],
"sms/constructor.tentative.https.any.js": [
[
"sms/constructor.tentative.https.any.html",
{
"script_metadata": [
[
"title",
"SMS Receiver API: Constructor"
]
]
}
],
[
"sms/constructor.tentative.https.any.worker.html",
{
"script_metadata": [
[
"title",
"SMS Receiver API: Constructor"
]
]
}
]
],
"sms/idlharness.https.any.js": [
[
"sms/idlharness.https.any.html",
@ -429381,6 +429519,12 @@
{}
]
],
"css/css-lists/change-list-style-type.html": [
[
"css/css-lists/change-list-style-type.html",
{}
]
],
"css/css-lists/list-style-type-armenian-002.xht": [
[
"css/css-lists/list-style-type-armenian-002.xht",
@ -502970,6 +503114,14 @@
"9233b4373e5e4dc5beb6713a9af1de861c5cf4d9",
"reftest"
],
"css/CSS2/positioning/abspos-negative-margin-001-ref.html": [
"e6f9bd6f9ad302edca80f34b70ebfcaf1d22e68c",
"support"
],
"css/CSS2/positioning/abspos-negative-margin-001.html": [
"6b6246eb195d102e23b8d4c7a9407235b6cc14c1",
"reftest"
],
"css/CSS2/positioning/abspos-overflow-001-ref.xht": [
"ba7e87c6a7c18a9335b51e07052ab47631299c9b",
"support"
@ -550914,6 +551066,14 @@
"228604ee357d22027c1691bf2baf27a52729222b",
"reftest"
],
"css/css-lists/change-list-style-type-ref.html": [
"033af1333132a2696d1a80ceacfc91f1ebf67a08",
"support"
],
"css/css-lists/change-list-style-type.html": [
"3d68ca4a7eaa0fe9bbc94c94fa290ce6026272c6",
"visual"
],
"css/css-lists/content-property/marker-text-matches-armenian-ref.html": [
"f21dfff69608a6a1201bd586c2a6e1e24d5fd915",
"support"
@ -555562,6 +555722,10 @@
"3e8899a94099983b147f0877a6d45a17341a0364",
"testharness"
],
"css/css-position/position-absolute-chrome-bug-002.html": [
"5fef5205f94576cc4834f98a2cb1f2007df94974",
"testharness"
],
"css/css-position/position-absolute-container-dynamic-002.html": [
"91d862835e6d1351deefb26f7e2b71a9539bbd6c",
"testharness"
@ -567790,6 +567954,10 @@
"9d6b2c2bc7d0cde02d992f741884bf702c0398a4",
"reftest"
],
"css/css-text/white-space/append-whitespace-only-node-crash-001.html": [
"b32555b18876898beb1b3b7b4559268d64ae9c1c",
"testharness"
],
"css/css-text/white-space/break-spaces-001.html": [
"f3b881afc1074db7511acbc419e5083ebde3413e",
"reftest"
@ -587270,6 +587438,10 @@
"899e411bdd302f2995a9d337ac5a3f89bd1c709b",
"testharness"
],
"css/cssom-view/elementFromPoint-subpixel.html": [
"ff67aa2e7f32aa56cc316a11302882caccfe69b6",
"testharness"
],
"css/cssom-view/elementFromPoint.html": [
"466fb5cb0a004e35cd74638a5187b01da9ca0a4d",
"testharness"
@ -588010,6 +588182,10 @@
"e66466e7a11b7883f9ad9de84d9cedc27ac3ea61",
"testharness"
],
"css/cssom/cssstyledeclaration-setter-form-controls.html": [
"ae556ed1cbec68c757188518e2cf6cd4ebd5cd05",
"testharness"
],
"css/cssom/cssstyledeclaration-setter-logical.html": [
"13d68e9a70229861dc1109972caa541147adb859",
"testharness"
@ -602143,7 +602319,7 @@
"support"
],
"docs/writing-tests/index.md": [
"20292fd33a3db279316355f8b5012070d41bc3b7",
"9680a359b27197f4acc8c08a786ddb1823b90a7a",
"support"
],
"docs/writing-tests/lint-tool.md": [
@ -604587,7 +604763,7 @@
"testharness"
],
"element-timing/background-image-multiple-elements.html": [
"24f72a67c34d0cc5323c6d4a0acb2e25085ec87a",
"084bb9ca0205815a1c7ad7764ce1979485e88435",
"testharness"
],
"element-timing/background-image-stretched.html": [
@ -604687,7 +604863,7 @@
"testharness"
],
"element-timing/observe-text.html": [
"a9a0e30adf353f342ad8bb6a2300ea90beb5d9fa",
"16382edaa9da45c246f34443ce3e70b7177f9203",
"testharness"
],
"element-timing/observe-video-poster.html": [
@ -627102,6 +627278,10 @@
"ca6900744dcf3a07d98ddaa17b4173fd4bed5fb9",
"testharness"
],
"html/semantics/scripting-1/the-script-element/module/inactive-context-import.html": [
"ce88c0a1528613e6586f2188e583d44d5c89fe67",
"testharness"
],
"html/semantics/scripting-1/the-script-element/module/inline-async-execorder.html": [
"db03612e82b42b6bd3294ced7468bb6c8b702520",
"testharness"
@ -631867,7 +632047,7 @@
"support"
],
"interfaces/webxr.idl": [
"f9bfdce58425350d1404c4beaac719e04c94a498",
"4af1c96a1847445c7559dabba20cb8a3a1de5c60",
"support"
],
"interfaces/worklets.idl": [
@ -632391,7 +632571,7 @@
"testharness"
],
"lint.whitelist": [
"be52aa67c00b9484180e316d6594e31d4918087d",
"9966d7c307b5520ab251d69f231526df762dc4ba",
"support"
],
"loading/preloader-css-import-no-quote.tentative.html": [
@ -632423,7 +632603,7 @@
"support"
],
"longtask-timing/idlharness.window.js": [
"96d939f04e7fbba348bf1edccf64c17c7af0535d",
"0ef7e85440ee1fc99c05ef5be0fc1fe61f818118",
"testharness"
],
"longtask-timing/longtask-attributes.html": [
@ -632738,6 +632918,30 @@
"7c11c14691162b69c1a2e854734ae6ac37db10e2",
"reftest"
],
"mathml/presentation-markup/operators/mo-movablelimits-default-ref.html": [
"8328637397962e973130c6d8544bda90690cc471",
"support"
],
"mathml/presentation-markup/operators/mo-movablelimits-default.html": [
"cd01fe47682ff1be6a09551589875088476f22c4",
"reftest"
],
"mathml/presentation-markup/operators/mo-movablelimits-dynamic-ref.html": [
"ee5bce2ca82066424da481e8b6ecebd80c4a2e19",
"support"
],
"mathml/presentation-markup/operators/mo-movablelimits-dynamic.html": [
"a92c6c01dc9da3aed4012843eb156b36f877d050",
"reftest"
],
"mathml/presentation-markup/operators/mo-movablelimits-ref.html": [
"cb868d2400e8b8e536e3103a06a5d4502b1dbfba",
"support"
],
"mathml/presentation-markup/operators/mo-movablelimits.html": [
"0855594100b2b5cac13fb464108bf130288c0e32",
"reftest"
],
"mathml/presentation-markup/operators/mo-paint-lspace-rspace-ref.html": [
"da0b79ff9a67cbe53daeb141aaa2efd4f2eb96ad",
"support"
@ -632862,6 +633066,14 @@
"aa38e9729de8569151b98307395ec8a2a5fe4b7f",
"testharness"
],
"mathml/relations/css-styling/mathsize-attribute-ref.html": [
"7a0450e51edf24d52a09b1ea4463483d7704bb75",
"support"
],
"mathml/relations/css-styling/mathsize-attribute.html": [
"00d12e4839cb91e5294409af03d3ad3847eb4213",
"reftest"
],
"mathml/relations/css-styling/mathvariant-bold-fraktur-ref.html": [
"b883b12b57dbc99c0049ba98c8d3574524c42505",
"support"
@ -646002,6 +646214,22 @@
"608a7c15c7996b5ed3cf534379417c3c077c4e82",
"testharness"
],
"quirks/body-fills-html-quirk-float.html": [
"19438bc1bf35b2c4fe674ccaabb7ef32331c50a1",
"reftest"
],
"quirks/body-fills-html-quirk-inline.html": [
"4f15bb97c94219e566ad3c992ad37894f9d40e62",
"reftest"
],
"quirks/body-fills-html-quirk-positioned.html": [
"3ce416dd95cbc288318079c70890f5febc59a174",
"reftest"
],
"quirks/body-fills-html-quirk-ref.html": [
"180afbb84f8444aa4d83342e5679dfda26754acb",
"support"
],
"quirks/classname-query-after-sibling-adoption.html": [
"0fcad36776d5a7fe160244dc342f227b76083798",
"testharness"
@ -646062,6 +646290,10 @@
"159d9a52a01a0b328680a530603cb496ab2d5fcf",
"support"
],
"quirks/reference/table-cell-width-calculation-abspos-ref.html": [
"3d365d25ad669f145a7e2ef5e4e6d0552713546a",
"support"
],
"quirks/support/test-ref-iframe.js": [
"e5df41d4249bc93b7458774524bf90f0a6f36be7",
"support"
@ -646074,6 +646306,10 @@
"2ff00b9ee794c07309c05f2500b4be1b326afd7e",
"testharness"
],
"quirks/table-cell-width-calculation-abspos.html": [
"f26d06040775c8e2447ade4230fcf28ec06dee3b",
"reftest"
],
"quirks/table-cell-width-calculation.html": [
"eeb726627b78fdcbf81d3c29b9205f771bd0aca8",
"testharness"
@ -661806,20 +662042,16 @@
"43b340dbb79f2585ef4acc4361ee94c6f22003f0",
"testharness"
],
"sms/constructor.tentative.https.any.js": [
"a624934ceeeace186038b15332d1c3c73968fbc7",
"testharness"
],
"sms/idlharness.https.any.js": [
"c030a5073a0a376a1b337e563c955f78bdad41dc",
"0c31744937c6dbc9b292586ab8ce5f10b268f3ed",
"testharness"
],
"sms/interceptor.https.html": [
"417120a12174859110f48a99a11405b7f2c0316e",
"4a6772f4416ab0550e451c710da1b48bbd9303d6",
"testharness"
],
"sms/resources/iframe.html": [
"44410e805f7b2857809794f582a97df0d1b0ac14",
"9a00e84c63b9321d9e29c10aeb266ff5c0b1d5e1",
"support"
],
"sms/sms-top-level-frame-only.https.html": [
@ -661827,11 +662059,11 @@
"testharness"
],
"sms/sms_provider.js": [
"dd3af9b747a3207d02c596b4fb6434772f3c44e3",
"a4759419a88670ec6e3f1cbd4ac3dcb3500ad57a",
"support"
],
"sms/sms_receiver.idl": [
"bc6fb1dc1037fc263a5a2da35d03449fee4db48b",
"b71b6a3e0db2b74b127e4332cd83f218bb39d6aa",
"support"
],
"speech-api/META.yml": [
@ -666655,7 +666887,7 @@
"support"
],
"tools/ci/website_build.sh": [
"f91975719be21e7c1461e4f8603c4f34639b840f",
"aadfcbd6a212574fa5462447072b996ae214de6b",
"support"
],
"tools/conftest.py": [
@ -675463,7 +675695,7 @@
"manual"
],
"web-nfc/NFCReadingEvent_constructor.https.html": [
"460e92b2508ba438a058d5ce9ab34db0d24349cf",
"da3e4c071d1e48a43be5ee27d775721d2af88e07",
"testharness"
],
"web-nfc/NFCWriter_push.https.html": [
@ -678423,7 +678655,7 @@
"testharness"
],
"webrtc/RTCPeerConnection-helper.js": [
"d859ac736ae6bf0187640dbe2148d8e0d64d9345",
"6a4ce854db70573a368ced9889e0623b15311f72",
"support"
],
"webrtc/RTCPeerConnection-iceConnectionState-disconnected.https.html": [
@ -678431,7 +678663,7 @@
"testharness"
],
"webrtc/RTCPeerConnection-iceConnectionState.https.html": [
"6d4ab50b0e266c30d6ce329e1f587886f33ae5fb",
"385bb51719e6ee5049f700f783d0faa6753cdff7",
"testharness"
],
"webrtc/RTCPeerConnection-iceGatheringState.html": [
@ -678719,7 +678951,7 @@
"support"
],
"webrtc/protocol/candidate-exchange.https.html": [
"2603a02cddf3f026b09b8a233d17ff3f92bd43a1",
"d1bc35819cee8e13485765e6f70836521dc5e7e7",
"testharness"
],
"webrtc/protocol/dtls-fingerprint-validation.html": [

View file

@ -0,0 +1,2 @@
[abspos-negative-margin-001.html]
expected: FAIL

View file

@ -74,3 +74,6 @@
[opacity end]
expected: FAIL
[outline-width end]
expected: FAIL

View file

@ -0,0 +1,4 @@
[elementFromPoint-subpixel.html]
[Hit test top left corner of box]
expected: FAIL

View file

@ -0,0 +1,2 @@
[matchMedia-display-none-iframe.html]
expected: ERROR

View file

@ -2,6 +2,7 @@
type: testharness
[single-byte-decoder.html?document]
expected: TIMEOUT
[ISO-8859-4: iso_8859-4:1988 (document.characterSet and document.inputEncoding)]
expected: FAIL

View file

@ -309,15 +309,9 @@
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
expected: FAIL
[<iframe>: separate response Content-Type: text/html */*]
expected: FAIL
[<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
expected: FAIL
[<iframe>: combined response Content-Type: text/html */*]
expected: FAIL
[<iframe>: separate response Content-Type: text/plain;charset=gbk text/html]
expected: FAIL
@ -330,3 +324,9 @@
[<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/html;" \\" text/plain]
expected: FAIL

View file

@ -38,9 +38,6 @@
[combined text/javascript;charset=windows-1252 x/x text/javascript]
expected: FAIL
[separate text/javascript;charset=windows-1252 text/javascript]
expected: FAIL
[separate x/x;" x/y;\\" text/javascript;charset=windows-1252;" text/javascript]
expected: FAIL

View file

@ -11,9 +11,6 @@
[X-Content-Type-Options%3A%20nosniff%0C]
expected: FAIL
[X-Content-Type-Options%3A%20no%0D%0AX-Content-Type-Options%3A%20nosniff]
expected: FAIL
[Content-Type-Options%3A%20nosniff]
[X-Content-Type-Options%3A%20%2Cnosniff]
expected: FAIL

View file

@ -1,4 +0,0 @@
[traverse_the_history_3.html]
[Multiple history traversals, last would be aborted]
expected: FAIL

View file

@ -1,24 +1,5 @@
[open-features-negative-innerwidth-innerheight.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: negative values for legacy `innerwidth`, `innerheight`]
expected: FAIL
[features "innerheight=-404.5" should NOT set "height=404"]
expected: TIMEOUT
[features "innerwidth=-404.5" should NOT set "width=404"]
expected: TIMEOUT
[features "innerwidth=-404" should NOT set "width=404"]
expected: TIMEOUT
[features "innerheight=-404e1" should NOT set "height=404"]
expected: TIMEOUT
[features "innerheight=-404" should NOT set "height=404"]
expected: TIMEOUT
[features "innerwidth=-404e1" should NOT set "width=404"]
expected: TIMEOUT

View file

@ -1,24 +1,5 @@
[open-features-negative-screenx-screeny.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: negative values for legacy `screenx`, `screeny`]
expected: FAIL
[features "screenx=-204" should NOT set "left=204"]
expected: TIMEOUT
[features "screeny=-204" should NOT set "top=204"]
expected: TIMEOUT
[features "screeny=-204.5" should NOT set "top=204"]
expected: TIMEOUT
[features "screeny=-0" should NOT set "top=204"]
expected: TIMEOUT
[features "screenx=-0" should NOT set "left=204"]
expected: TIMEOUT
[features "screenx=-204.5" should NOT set "left=204"]
expected: TIMEOUT

View file

@ -1,24 +1,5 @@
[open-features-negative-top-left.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: negative values for `top`, `left`]
expected: FAIL
[features "top=-204" should NOT set "top=204"]
expected: TIMEOUT
[features "top=-204.5" should NOT set "top=204"]
expected: TIMEOUT
[features "left=-204" should NOT set "left=204"]
expected: TIMEOUT
[features "top=-0" should NOT set "top=204"]
expected: TIMEOUT
[features "left=-204.5" should NOT set "left=204"]
expected: TIMEOUT
[features "left=-0" should NOT set "left=204"]
expected: TIMEOUT

View file

@ -1,24 +1,5 @@
[open-features-negative-width-height.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: negative values for `width`, `height`]
expected: FAIL
[features "height=-404" should NOT set "height=404"]
expected: TIMEOUT
[features "height=-404e1" should NOT set "height=404"]
expected: TIMEOUT
[features "height=-404.5" should NOT set "height=404"]
expected: TIMEOUT
[features "width=-404" should NOT set "width=404"]
expected: TIMEOUT
[features "width=-404e1" should NOT set "width=404"]
expected: TIMEOUT
[features "width=-404.5" should NOT set "width=404"]
expected: TIMEOUT

View file

@ -1,48 +1,32 @@
[open-features-non-integer-height.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: non-integer values for feature `height`]
expected: FAIL
[features "height=405*3" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "height=405.32" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "height=405e1" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "height=405/5" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "height=405^4" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "height=405.5" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "height=405e-1" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "height=405 " should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "height=405LLl" should set "height=405"]
expected: TIMEOUT
[features "height=/404" should NOT set "height=404"]
expected: TIMEOUT
[top=0,left=0,width=401,: absence of feature "height" should be treated same as "height=0"]
expected: TIMEOUT
[top=0,left=0: absence of feature "height" should be treated same as "height=0"]
expected: TIMEOUT
[features "height=_404" should NOT set "height=404"]
expected: TIMEOUT
[features "height=L404" should NOT set "height=404"]
expected: TIMEOUT
expected: FAIL

View file

@ -1,42 +1,32 @@
[open-features-non-integer-innerheight.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `innerheight`]
expected: FAIL
[features "innerheight=405e-1" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "innerheight=405LLl" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "innerheight=405^4" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "innerheight=405e1" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "innerheight=405 " should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "innerheight=405/5" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "innerheight=405.32" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "innerheight=405.5" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "innerheight=405*3" should set "height=405"]
expected: TIMEOUT
[features "innerheight=_404" should NOT set "height=404"]
expected: TIMEOUT
[features "innerheight=L404" should NOT set "height=404"]
expected: TIMEOUT
[features "innerheight=/404" should NOT set "height=404"]
expected: TIMEOUT
expected: FAIL

View file

@ -1,42 +1,32 @@
[open-features-non-integer-innerwidth.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `innerwidth`]
expected: FAIL
[features "innerwidth=405e-1" should set "width=405"]
expected: TIMEOUT
expected: FAIL
[features "innerwidth=405*3" should set "width=405"]
expected: TIMEOUT
expected: FAIL
[features "innerwidth=405.5" should set "width=405"]
expected: TIMEOUT
expected: FAIL
[features "innerwidth=405e1" should set "width=405"]
expected: TIMEOUT
expected: FAIL
[features "innerwidth=405.32" should set "width=405"]
expected: TIMEOUT
expected: FAIL
[features "innerwidth=405 " should set "width=405"]
expected: TIMEOUT
expected: FAIL
[features "innerwidth=405LLl" should set "width=405"]
expected: TIMEOUT
expected: FAIL
[features "innerwidth=405/5" should set "width=405"]
expected: TIMEOUT
expected: FAIL
[features "innerwidth=405^4" should set "width=405"]
expected: TIMEOUT
[features "innerwidth=/404" should NOT set "width=404"]
expected: TIMEOUT
[features "innerwidth=_404" should NOT set "width=404"]
expected: TIMEOUT
[features "innerwidth=L404" should NOT set "width=404"]
expected: TIMEOUT
expected: FAIL

View file

@ -1,42 +1,32 @@
[open-features-non-integer-left.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: non-integer values for feature `left`]
expected: FAIL
[features "left=105e1" should set "left=105"]
expected: TIMEOUT
expected: FAIL
[features "left=105 " should set "left=105"]
expected: TIMEOUT
expected: FAIL
[features "left=105/5" should set "left=105"]
expected: TIMEOUT
expected: FAIL
[features "left=105e-1" should set "left=105"]
expected: TIMEOUT
expected: FAIL
[features "left=105^4" should set "left=105"]
expected: TIMEOUT
expected: FAIL
[features "left=105LLl" should set "left=105"]
expected: TIMEOUT
expected: FAIL
[features "left=105.32" should set "left=105"]
expected: TIMEOUT
expected: FAIL
[features "left=105*3" should set "left=105"]
expected: TIMEOUT
expected: FAIL
[features "left=105.5" should set "left=105"]
expected: TIMEOUT
[features "left=L104" should NOT set "left=104"]
expected: TIMEOUT
[features "left=/104" should NOT set "left=104"]
expected: TIMEOUT
[features "left=_104" should NOT set "left=104"]
expected: TIMEOUT
expected: FAIL

View file

@ -1,42 +1,32 @@
[open-features-non-integer-screenx.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `screenx`]
expected: FAIL
[features "screenx=105.5" should set "left=105"]
expected: TIMEOUT
expected: FAIL
[features "screenx=105e1" should set "left=105"]
expected: TIMEOUT
expected: FAIL
[features "screenx=105 " should set "left=105"]
expected: TIMEOUT
expected: FAIL
[features "screenx=105*3" should set "left=105"]
expected: TIMEOUT
expected: FAIL
[features "screenx=105e-1" should set "left=105"]
expected: TIMEOUT
expected: FAIL
[features "screenx=105^4" should set "left=105"]
expected: TIMEOUT
expected: FAIL
[features "screenx=105LLl" should set "left=105"]
expected: TIMEOUT
expected: FAIL
[features "screenx=105/5" should set "left=105"]
expected: TIMEOUT
expected: FAIL
[features "screenx=105.32" should set "left=105"]
expected: TIMEOUT
[features "screenx=_104" should NOT set "left=104"]
expected: TIMEOUT
[features "screenx=L104" should NOT set "left=104"]
expected: TIMEOUT
[features "screenx=/104" should NOT set "left=104"]
expected: TIMEOUT
expected: FAIL

View file

@ -1,42 +1,32 @@
[open-features-non-integer-screeny.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: non-integer values for legacy feature `screeny`]
expected: FAIL
[features "screeny=405^4" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "screeny=405e-1" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "screeny=405LLl" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "screeny=405e1" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "screeny=405 " should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "screeny=405/5" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "screeny=405*3" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "screeny=405.32" should set "height=405"]
expected: TIMEOUT
expected: FAIL
[features "screeny=405.5" should set "height=405"]
expected: TIMEOUT
[features "screeny=_404" should NOT set "height=404"]
expected: TIMEOUT
[features "screeny=L404" should NOT set "height=404"]
expected: TIMEOUT
[features "screeny=/404" should NOT set "height=404"]
expected: TIMEOUT
expected: FAIL

View file

@ -1,48 +1,32 @@
[open-features-non-integer-width.html]
type: testharness
expected: TIMEOUT
[HTML: window.open `features`: non-integer values for feature `width`]
expected: FAIL
[features "width=405^4" should set "width=405"]
expected: TIMEOUT
expected: FAIL
[features "width=405.5" should set "width=405"]
expected: TIMEOUT
expected: FAIL
[features "width=405e1" should set "width=405"]
expected: TIMEOUT
expected: FAIL
[features "width=405 " should set "width=405"]
expected: TIMEOUT
expected: FAIL
[features "width=405.32" should set "width=405"]
expected: TIMEOUT
expected: FAIL
[features "width=405LLl" should set "width=405"]
expected: TIMEOUT
expected: FAIL
[features "width=405*3" should set "width=405"]
expected: TIMEOUT
expected: FAIL
[features "width=405e-1" should set "width=405"]
expected: TIMEOUT
expected: FAIL
[features "width=405/5" should set "width=405"]
expected: TIMEOUT
[top=0,left=0: absence of feature "width" should be treated same as "width=0"]
expected: TIMEOUT
[features "width=_404" should NOT set "width=404"]
expected: TIMEOUT
[top=0,left=0,height=401,: absence of feature "width" should be treated same as "width=0"]
expected: TIMEOUT
[features "width=/404" should NOT set "width=404"]
expected: TIMEOUT
[features "width=L404" should NOT set "width=404"]
expected: TIMEOUT
expected: FAIL

View file

@ -1,10 +0,0 @@
[non-active-document.html]
[DOMParser]
expected: FAIL
[createHTMLDocument]
expected: FAIL
[<template>]
expected: FAIL

View file

@ -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

View file

@ -40,3 +40,7 @@
[test_height_width_larger_than_max]
expected: FAIL
[test_negative_x_y]
expected: FAIL

View file

@ -0,0 +1,18 @@
<!DOCTYPE html>
<style>
div {
font-size: 10px;
line-height: 1;
}
.blue {
display: inline-block;
vertical-align: bottom;
width: 10px;
height: 10px;
background: blue;
}
</style>
<body>
<div>x<span class="blue"></span></div>
<div>x<br><span class="blue"></span></div>
</body>

View file

@ -0,0 +1,33 @@
<!DOCTYPE html>
<title>CSS Test: Absolutely positioned object in a negative margin box</title>
<link rel="author" title="Koji Ishii" href="mailto:kojii@chromium.org">
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#comp-abspos">
<link rel="match" href="abspos-negative-margin-001-ref.html">
<style>
html {
font-size: 10px;
line-height: 1;
}
.abspos {
position:absolute;
width: 10px;
height: 10px;
background: blue;
}
</style>
<body>
<div>
<span>
<span style="margin-right: -10px;">
x<span class="abspos"></span>
</span>
</span>
</div>
<div>
<span>
<span style="margin-right: -10px;">
x<div class="abspos"></div>
</span>
</span>
</div>
</body>

View file

@ -0,0 +1,45 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Lists: test the change of list-style-type</title>
<link rel=help href="https://www.w3.org/TR/CSS22/generate.html#lists">
<link rel=help href="https://bugs.chromium.org/p/chromium/issues/detail?id=966750">
<style type="text/css">
.inside {
list-style-position: inside;
}
.none2symbol {
list-style-type: square;
}
.symbol2none {
list-style-type: none;
}
.symbol2symbol {
list-style-type: square;
}
.symbol2ordinal {
list-style-type: upper-roman;
}
.ordinal2ordinal {
list-style-type: decimal;
}
</style>
<ul class="inside"><li class="none2symbol">inside: none to square</li></ul>
<ul><li class="none2symbol">outside: none to square</li></ul>
<ul class="inside"><li class="symbol2none">inside: square to none</li></ul>
<ul><li class="symbol2none">outside: square to none</li></ul>
<ul class="inside"><li class="symbol2symbol">inside: disc to square</li></ul>
<ul><li class="symbol2symbol">outside: disc to square</li></ul>
<ul class="inside"><li class="symbol2ordinal">inside: disc to upper-roman</li></ul>
<ul><li class="symbol2ordinal">outside: disc to upper-roman</li></ul>
<ul class="inside"><li class="ordinal2ordinal">inside: upper-roman to decimal</li></ul>
<ul><li class="ordinal2ordinal">outside: upper-roman to decimal</li></ul>

View file

@ -0,0 +1,71 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>CSS Lists: test the change of list-style-type</title>
<link rel=help href="https://www.w3.org/TR/CSS22/generate.html#lists">
<link rel=help href="https://bugs.chromium.org/p/chromium/issues/detail?id=966750">
<style type="text/css">
.inside {
list-style-position: inside;
}
.none2symbol {
list-style-type: none;
}
.symbol2none {
list-style-type: square;
}
.symbol2symbol {
list-style-type: disc;
}
.symbol2ordinal {
list-style-type: disc;
}
.ordinal2ordinal {
list-style-type: upper-roman;
}
</style>
<ul class="inside"><li class="none2symbol">inside: none to square</li></ul>
<ul><li class="none2symbol">outside: none to square</li></ul>
<ul class="inside"><li class="symbol2none">inside: square to none</li></ul>
<ul><li class="symbol2none">outside: square to none</li></ul>
<ul class="inside"><li class="symbol2symbol">inside: disc to square</li></ul>
<ul><li class="symbol2symbol">outside: disc to square</li></ul>
<ul class="inside"><li class="symbol2ordinal">inside: disc to upper-roman</li></ul>
<ul><li class="symbol2ordinal">outside: disc to upper-roman</li></ul>
<ul class="inside"><li class="ordinal2ordinal">inside: upper-roman to decimal</li></ul>
<ul><li class="ordinal2ordinal">outside: upper-roman to decimal</li></ul>
<script>
document.body.offsetLeft;
</script>
<style type="text/css">
.none2symbol {
list-style-type: square;
}
.symbol2none {
list-style-type: none;
}
.symbol2symbol {
list-style-type: square;
}
.symbol2ordinal {
list-style-type: upper-roman;
}
.ordinal2ordinal {
list-style-type: decimal;
}
</style>

View file

@ -0,0 +1,39 @@
<!DOCTYPE html>
<link rel="author" href="mailto:atotic@google.com">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="help" href="https://crbug.com/970166">
<meta name="assert" content="simplified layout calculates correct abspos position with floats">
<style>
#container {
position: relative;
background: gray;
}
#container::after {
content: '';
display: table;
clear:both;
}
#target {
position: absolute;
right: 0;
background: green;
}
</style>
<div id="container">
<div style="float:left">floatleft</div>
<div id="target">
<div>text</div>
<div id="toggle">toggle</div>
</div>
</div>
<script>
test(() => {
document.body.offsetTop;
let el = document.querySelector("#toggle");
el.style.display = "none";
document.body.offsetTop;
assert_equals(document.querySelector("#target").offsetTop, 0);
}, '#target position is recalculated correctly.');
</script>

View file

@ -0,0 +1,36 @@
<!DOCTYPE html>
<link rel="help" href="https://crbug.com/971811">
<link rel="author" title="Koji Ishii" href="mailto:kojii@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<div id="log"></div>
<script>
const strings = [' ', '\t', '\n', '\f', '\r'];
const whitespace_values = ['normal', 'pre', 'nowrap', 'pre-wrap', 'break-spaces', 'pre-line'];
const container = document.body;
for (let whitespace_value of whitespace_values) {
for (let string of strings) {
test(() => {
let div = document.createElement('div');
div.style.whiteSpace = whitespace_value;
div.textContent = 'test';
container.appendChild(div);
container.offsetTop; // Force layout
div.appendChild(document.createTextNode(string));
container.offsetTop; // Force layout
}, `Append ${toCodePoints(string)} to 'white-space: ${whitespace_value}'`);
}
}
function toCodePoints(string) {
let results = [];
for (let ch of string) {
let hex = ch.codePointAt(0).toString(16).toUpperCase();
hex = ('000' + hex).substr(-4)
results.push('U+' + hex);
}
return results.join(' ');
}
</script>
</body>

View file

@ -0,0 +1,59 @@
<!DOCTYPE html>
<html>
<head>
<title>CSSOM View - extensions to the Document interface</title>
<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org">
<link rel="help" href="http://www.w3.org/TR/cssom-view/#extensions-to-the-document-interface">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
.container {
display: flex;
width: 500px;
height: 100px;
}
.map {
flex: 1 1 auto;
position: relative;
}
.box {
flex: 0 0 auto;
}
.child {
width: 183.66px;
}
</style>
</head>
<body>
<div class="container">
<div class="map"></div>
<div class="box" id="box">
<div class="child"></div>
</div>
</div>
<script>
const box = document.getElementById('box');
const rect = box.getBoundingClientRect();
test(() => {
assert_equals(document.elementFromPoint(rect.x, rect.y), box);
}, 'Hit test top left corner of box');
test(() => {
assert_equals(document.elementFromPoint(rect.x + rect.width - 1, rect.y), box);
}, 'Hit test top right corner of box');
test(() => {
assert_equals(document.elementFromPoint(rect.x, rect.y + rect.height - 1), box);
}, 'Hit test bottom left corner of box');
test(() => {
assert_equals(document.elementFromPoint(rect.x + rect.width - 1, rect.y + rect.height - 1), box);
}, 'Hit test lower left corner of box');
</script>
</body>
</html>

View file

@ -0,0 +1,103 @@
<!doctype html>
<title>CSSOM test: no side effects from setting "height"</title>
<link rel="help" href="https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-setproperty">
<link rel="help" href="https://bugs.webkit.org/show_bug.cgi?id=107380">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<p>
Historically, the Apple Safari web browser has added an "intrinsic margin" to
form controls which do not specify a `height`. It removed this margin following
modification of the `height`. <a
href="https://bugs.webkit.org/show_bug.cgi?id=107380">This non-standard
behavior was identified as a source of confusion for web developers.</a>
</p>
<script>
function makeElement(tagName) {
var element = document.createElement(tagName);
document.body.appendChild(element);
return element;
}
function makeInputElement(type) {
var element = makeElement('input');
element.setAttribute('type', type);
return element;
}
function measure(element) {
var computed = getComputedStyle(element);
return [computed.marginTop, computed.marginBottom];
}
test(function() {
var element = makeInputElement('text');
var initial = measure(element);
element.style.setProperty('height', '12px');
assert_array_equals(measure(element), initial);
}, 'text input element');
test(function() {
var element = makeInputElement('button');
var initial = measure(element);
element.style.setProperty('height', '12px');
assert_array_equals(measure(element), initial);
}, 'button input element');
test(function() {
var element = makeInputElement('submit');
var initial = measure(element);
element.style.setProperty('height', '12px');
assert_array_equals(measure(element), initial);
}, 'submit input element');
test(function() {
var element = makeInputElement('radio');
var initial = measure(element);
element.style.setProperty('height', '12px');
assert_array_equals(measure(element), initial);
}, 'radio input element');
test(function() {
var element = makeInputElement('checkbox');
var initial = measure(element);
element.style.setProperty('height', '12px');
assert_array_equals(measure(element), initial);
}, 'checkbox input element');
test(function() {
var element = makeElement('textarea');
var initial = measure(element);
element.style.setProperty('height', '12px');
assert_array_equals(measure(element), initial);
}, 'textarea element');
test(function() {
var element = makeElement('select');
var initial = measure(element);
element.style.setProperty('height', '12px');
assert_array_equals(measure(element), initial);
}, 'select element');
test(function() {
var element = makeElement('button')
var initial = measure(element);
element.style.setProperty('height', '12px');
assert_array_equals(measure(element), initial);
}, 'button element');
</script>

View file

@ -22,6 +22,8 @@ There's also a load of [general guidelines](general-guidelines) that apply to al
rendering
server-features
submission-process
testdriver
testdriver-tutorial
testharness
visual
wdspec

View file

@ -61,6 +61,8 @@ body {
observedDiv2Txt = true;
checkTextElement(entry, 'et2', 'div2', beforeRender,
document.getElementById('div2'));
assert_greater_than_equal(entry.intersectionRect.right - entry.intersectionRect.left, 50);
assert_greater_than_equal(entry.intersectionRect.bottom - entry.intersectionRect.top, 10);
}
}
else {

View file

@ -2,6 +2,14 @@
<meta charset=utf-8>
<title>Element Timing: observe text</title>
<body>
<style>
body {
margin: 20px;
}
p {
font-size: 12px;
}
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/element-timing-helpers.js"></script>
@ -15,7 +23,14 @@
const observer = new PerformanceObserver(
t.step_func_done((entryList) => {
assert_equals(entryList.getEntries().length, 1);
checkTextElement(entryList.getEntries()[0], 'my_text', 'text_id', beforeRender, paragraph);
const entry = entryList.getEntries()[0];
checkTextElement(entry, 'my_text', 'text_id', beforeRender, paragraph);
assert_equals(entry.intersectionRect.left, 20);
// Text box size will vary from device to device, so try lower bounding height by 12, width by 100.
assert_greater_than_equal(entry.intersectionRect.right, 120);
assert_equals(entry.intersectionRect.top, 20);
assert_greater_than_equal(entry.intersectionRect.bottom, 32);
})
);
observer.observe({entryTypes: ['element']});

View file

@ -0,0 +1,20 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>Dynamic import triggered from inactive context should not crash</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="container">
<iframe></iframe>
</div>
<script>
test(() => {
const iframe = document.querySelector('iframe');
const otherWindow = iframe.contentWindow;
iframe.remove();
// Below should not crash
otherWindow.eval(`import('foobar');`);
}, 'dynamic import from inactive context should not crash');
</script>

View file

@ -203,8 +203,6 @@ dictionary XRWebGLLayerInit {
optional XRWebGLLayerInit layerInit)]
interface XRWebGLLayer {
// Attributes
[SameObject] readonly attribute XRWebGLRenderingContext context;
readonly attribute boolean antialias;
readonly attribute boolean ignoreDepthValues;

View file

@ -813,10 +813,6 @@ LAYOUTTESTS APIS: permissions/test-background-fetch-permission.html
LAYOUTTESTS APIS: resources/chromium/generic_sensor_mocks.js
LAYOUTTESTS APIS: resources/chromium/webxr-test.js
# Gecko additons to remove
CSS-COLLIDING-REF-NAME: css/css-contain/reference/contain-size-fieldset-001-ref.html
CSS-COLLIDING-REF-NAME: css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-fieldset-001-ref.html
# Signed Exchange files have hard-coded URLs in the certUrl field
WEB-PLATFORM.TEST:signed-exchange/resources/*.sxg
WEB-PLATFORM.TEST:signed-exchange/appcache/resources/*.sxg

View file

@ -1,21 +1,20 @@
// META: script=/resources/WebIDLParser.js
// META: script=/resources/idlharness.js
// https://w3c.github.io/longtask-timing/
// https://w3c.github.io/longtasks/
'use strict';
promise_test(async t => {
const srcs = ['longtasks', 'performance-timeline'];
const [idl, perf] = await Promise.all(
srcs.map(i => fetch(`/interfaces/${i}.idl`).then(r => r.text())));
idl_test(
['longtasks'],
['performance-timeline'],
(idl_array, t) => new Promise((resolve, reject) => {
const longTask = () => {
const begin = self.performance.now();
while (self.performance.now() < begin + 100);
}
t.step_timeout(longTask, 0);
const idl_array = new IdlArray();
idl_array.add_idls(idl);
idl_array.add_dependency_idls(perf);
const testIdls = new Promise(resolve => {
try {
const observer = new PerformanceObserver(entryList => {
const entries = Array.from(entryList.getEntries());
const attribution = entries.reduce(
@ -24,28 +23,12 @@ promise_test(async t => {
PerformanceLongTaskTiming: entries,
TaskAttributionTiming: attribution,
});
idl_array.test();
resolve();
});
observer.observe({entryTypes: ['longtask']});
} catch (e) {
// Will be surfaces in idlharness.js's test_object below.
}
});
const longTask = () => {
var begin = self.performance.now();
while (self.performance.now() < begin + 100);
}
t.step_timeout(longTask, 0);
const timeout = new Promise(
(_, reject) => t.step_timeout(reject, 1000));
return Promise.race([testIdls, timeout])
.then(
t.step_func_done(),
() => {
idl_array.test(); // Rejected, but test what we can.
return Promise.reject('LongTask was not observed');
});
}, 'longtasks interfaces');
t.step_timeout(() => {
reject('longtask entry was not observed');
}, 1000);
})
);

View file

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<title>mo movablelimits default value</title>
<meta charset="utf-8"/></head>
<body>
<math>
<munder>
<mo movablelimits="true"></mo>
<mi>x</mi>
</munder>
<munder>
<mo movablelimits="false"></mo>
<mi>x</mi>
</munder>
</math>
</body>
</html>

View file

@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>&lt;mo&gt; movablelimits default value</title>
<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#tokenmo">
<meta name="assert" content="Verifies default value of movablelimits for some operators.">
<link rel="match" href="mo-movablelimits-default-ref.html">
</head>
<body>
<math>
<munder>
<mo></mo> <!-- This has movablelimits="true" in the operator dictionary -->
<mi>x</mi>
</munder>
<munder>
<mo></mo> <!-- This has movablelimits="false" in the operator dictionary -->
<mi>x</mi>
</munder>
</math>
</body>
</html>

View file

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Test dynamically removing movablelimits attribute</title>
</head>
<body>
<math>
<munder>
<mo></mo>
<mi>x</mi>
</munder>
</math>
</body>
</html>

View file

@ -0,0 +1,24 @@
<!DOCTYPE html>
<html class="reftest-wait">
<head>
<meta charset="utf-8"/>
<title>Test dynamically removing movablelimits attribute</title>
<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#tokenmo">
<meta name="assert" content="Verifies dynamically removing movablelimits.">
<link rel="match" href="mo-movablelimits-dynamic-ref.html">
<script>
window.addEventListener("load", () => {
document.getElementById('a').removeAttribute('movablelimits');
document.documentElement.classList.remove('reftest-wait');
});
</script>
</head>
<body>
<math>
<munder>
<mo id="a" movablelimits="false"></mo>
<mi>x</mi>
</munder>
</math>
</body>
</html>

View file

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>&lt;mo&gt; movablelimits</title>
</head>
<body>
<math>
<msub>
<mtext>A</mtext>
<mi>B</mi>
</msub>
<munder>
<mtext>A</mtext>
<mi>B</mi>
</munder>
</math>
<math displaystyle="true">
<munder>
<mtext>A</mtext>
<mi>B</mi>
</munder>
<munder>
<mtext>A</mtext>
<mi>B</mi>
</munder>
</math>
</body>
</html>

View file

@ -0,0 +1,32 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>&lt;mo&gt; movablelimits</title>
<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#tokenmo">
<meta name="assert" content="Verifies effect of movablelimits on mo in both displaystyle modes.">
<link rel="match" href="mo-movablelimits-ref.html">
</head>
<body>
<math>
<munder>
<mo lspace="0px" rspace="0px" movablelimits="true">A</mo>
<mi>B</mi>
</munder>
<munder>
<mo lspace="0px" rspace="0px" movablelimits="false">A</mo>
<mi>C</mi>
</munder>
</math>
<math displaystyle="true">
<munder>
<mo lspace="0px" rspace="0px" movablelimits="true">A</mo>
<mi>B</mi>
</munder>
<munder>
<mo lspace="0px" rspace="0px" movablelimits="false">A</mo>
<mi>B</mi>
</munder>
</math>
</body>
</html>

View file

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Verify mathsize attribute</title>
</head>
<body>
<!-- The style attribute should have the same effect as the mathsize
attribute. -->
<div>
<math>
<mi style="font-size: 200%;">x</mi>
<mi style="font-size: 3em;">x</mi>
</math>
</div>
</body>
</html>

View file

@ -0,0 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Verify mathsize attribute</title>
<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes">
<meta name="assert" content="Verify mathsize attribute values.">
<link rel="match" href="mathsize-attribute-ref.html">
</head>
<body>
<!-- This verifies the effect of the mathsize attribute. -->
<div>
<math>
<mi mathsize="200%">x</mi>
<mi mathsize="3em">x</mi>
</math>
</div>
</body>
</html>

View file

@ -0,0 +1,18 @@
<!DOCTYPE quirks-mode>
<link rel="help" href="https://quirks.spec.whatwg.org/#the-body-element-fills-the-html-element-quirk">
<link rel="match" href="body-fills-html-quirk-ref.html">
<style>
body {
border: solid;
float: left;
}
span {
display: inline-block;
width: 100px;
height: 100px;
background: green;
}
</style>
<body>
<span></span>
</body>

View file

@ -0,0 +1,18 @@
<!DOCTYPE quirks-mode>
<link rel="help" href="https://quirks.spec.whatwg.org/#the-body-element-fills-the-html-element-quirk">
<link rel="match" href="body-fills-html-quirk-ref.html">
<style>
body {
border: solid;
display: inline-block;
}
span {
display: inline-block;
width: 100px;
height: 100px;
background: green;
}
</style>
<body>
<span></span>
</body>

View file

@ -0,0 +1,18 @@
<!DOCTYPE quirks-mode>
<link rel="help" href="https://quirks.spec.whatwg.org/#the-body-element-fills-the-html-element-quirk">
<link rel="match" href="body-fills-html-quirk-ref.html">
<style>
body {
border: solid;
position: absolute;
}
span {
display: inline-block;
width: 100px;
height: 100px;
background: green;
}
</style>
<body>
<span></span>
</body>

View file

@ -0,0 +1,2 @@
<!DOCTYPE html>
<div style="width: 100px; height: 100px; border: solid; background: green;"></div>

View file

@ -0,0 +1,17 @@
<style>
table {
font-size: 10px;
font-family: Ahem;
}
img {
vertical-align: bottom;
width: 10px;
height: 10px;
background: black;
}
</style>
<table>
<tr>
<td id="td">1234567<img id="img" src=""></td>
</tr>
</table>

View file

@ -0,0 +1,20 @@
<title>An out-of-flow imagef in the table cell width calculation quirk</title>
<link rel="match" href="reference/table-cell-width-calculation-abspos-ref.html">
<link rel="author" title="Koji Ishii" href="mailto:kojii@chromium.org">
<style>
table {
font-size: 10px;
font-family: Ahem;
}
img {
position: absolute;
width: 10px;
height: 10px;
background: black;
}
</style>
<table>
<tr>
<td id="td">1234567<img id="img" src=""></td>
</tr>
</table>

View file

@ -1,52 +0,0 @@
// META: title=SMS Receiver API: Constructor
'use strict';
test(function() {
let used = false;
new SMSReceiver({
get timeout() {
used = true;
return 60;
}
});
assert_true(used, 'constructor options "timeout" member was used');
}, 'constructor uses timeout property');
test(function() {
assert_throws(new TypeError(), function () {
new SMSReceiver({timeout: 0});
assert_unreached('Timeout 0 should reject');
});
}, 'constructor throws with invalid timeout (0)');
test(function() {
assert_throws(new TypeError(), function () {
new SMSReceiver({timeout: null});
assert_unreached('Timeout of null should reject');
});
}, 'constructor throws with invalid timeout (null)');
test(function() {
assert_throws(new TypeError(), function () {
new SMSReceiver({timeout: -1});
assert_unreached('Timeout negative numbers should reject');
});
}, 'constructor throws with invalid timeout (-1)');
test(function() {
assert_throws(new TypeError(), function () {
new SMSReceiver({timeout: NaN});
assert_unreached('Timeout of NaN should reject');
});
}, 'constructor throws with invalid timeout (NaN)');
test(function() {
new SMSReceiver();
}, 'constructor uses a default value for the timeout when none is passed');
test(function() {
new SMSReceiver({timeout: undefined});
}, 'constructor uses a default value for the timeout');

View file

@ -19,12 +19,12 @@ promise_test(async (t) => {
idl_array.add_dependency_idls(dom);
idl_array.add_dependency_idls(html);
self.receiver = new SMSReceiver({timeout: 60});
idl_array.add_objects({
SmsReceiver: ['receiver'],
SmsReceiver: ['navigator.sms'],
});
idl_array.add_objects({ Navigator: ['navigator'] })
idl_array.test();
}, 'Test IDL implementation of the SMS Receiver API');

View file

@ -15,7 +15,7 @@
await expect(getNextMessage).andReturn((timeout) => {
// mock behavior
})
3) Call new SMSReceiver().start();
3) Call navigator.sms.receive()
4) Verify results
The mocking API is browser agnostic and is designed such that other engines
@ -25,7 +25,7 @@
per engine:
- function getNextMessage(): the main/only function that can be mocked.
- function expect(): the main/only function that enables us to mock it.
- function expect(): the main/only function that enables us to mock it
- enum State {kSuccess, kTimeout}: allows you to mock success/failures.
-->
@ -43,37 +43,140 @@ promise_test(async t => {
});
});
let receiver = new SMSReceiver();
let sms = await navigator.sms.receive();
let watcher = new EventWatcher(t, receiver, ["change"]);
await receiver.start();
// Waits for the first event.
await watcher.wait_for("change");
assert_equals(receiver.sms.content, "hello");
assert_equals(sms.content, "hello");
}, 'Basic usage');
promise_test(async t => {
await expect(getNextMessage).andReturn((timeout) => {
return Promise.resolve({
sms: {
content: "",
content: "hello1",
status: Status.kSuccess,
}
});
});
await expect(getNextMessage).andReturn((timeout) => {
return Promise.resolve({
sms: {
content: "hello2",
status: Status.kSuccess,
}
});
});
let sms1 = navigator.sms.receive();
let sms2 = navigator.sms.receive();
let msg2 = await sms2;
let msg1 = await sms1;
assert_equals(msg1.content, "hello1");
assert_equals(msg2.content, "hello2");
}, 'Handle multiple requests in different order.');
promise_test(async t => {
await expect(getNextMessage).andReturn((timeout) => {
return Promise.resolve({
sms: {
status: Status.kTimeout
}
});
});
await expect(getNextMessage).andReturn((timeout) => {
return Promise.resolve({
sms: {
content: "success",
status: Status.kSuccess
}
});
});
let timeout_sms = navigator.sms.receive();
let successful_sms = navigator.sms.receive();
let successful_msg = await successful_sms;
assert_equals(successful_msg.content, "success");
try {
await timeout_sms;
assert_unreached('Expected TimeoutError to be thrown.');
} catch (error) {
assert_equals(error.name, "TimeoutError");
assert_equals(error.message, "SMSReceiver timed out.");
}
}, 'Handle multiple requests with success and error.');
promise_test(async t => {
await expect(getNextMessage).andReturn((timeout) => {
return Promise.resolve({
sms: {
status: Status.kTimeout,
}
});
});
let receiver = new SMSReceiver();
let watcher = new EventWatcher(t, receiver, ["timeout"]);
await receiver.start();
// Waits for the first event.
await watcher.wait_for("timeout");
try {
await navigator.sms.receive();
assert_unreached('Expected TimeoutError to be thrown.');
} catch (error) {
assert_equals(error.name, "TimeoutError");
assert_equals(error.message, "SMSReceiver timed out.");
}
}, 'Deal with timeouts');
promise_test(async t => {
try {
await navigator.sms.receive({timeout: 0});
assert_unreached('Expected NotSupportedError to be thrown.');
} catch (error) {
assert_equals(error.name, "NotSupportedError");
assert_equals(error.message, "Invalid timeout.");
}
}, 'Should throw error with invalid timeout (0)');
promise_test(async t => {
try {
await navigator.sms.receive({timeout: null});
assert_unreached('Expected NotSupportedError to be thrown.');
} catch (error) {
assert_equals(error.name, "NotSupportedError");
assert_equals(error.message, "Invalid timeout.");
}
}, 'Should throw error with invalid timeout (null)');
promise_test(async t => {
try {
await navigator.sms.receive({timeout: -1});
assert_unreached('Expected NotSupportedError to be thrown.');
} catch (error) {
assert_equals(error.name, "NotSupportedError");
assert_equals(error.message, "Invalid timeout.");
}
}, 'Should throw error with invalid timeout (-1)');
promise_test(async t => {
try {
await navigator.sms.receive({timeout: NaN});
assert_unreached('Expected NotSupportedError to be thrown.');
} catch (error) {
assert_equals(error.name, "NotSupportedError");
assert_equals(error.message, "Invalid timeout.");
}
}, 'Should throw error with invalid timeout (NaN)');
promise_test(async t => {
await expect(getNextMessage).andReturn((timeout) => {
return Promise.resolve({
sms: {
content: "hello",
status: Status.kSuccess,
}
});
});
let sms = await navigator.sms.receive({timeout: undefined});
assert_equals(sms.content, "hello");
}, 'Should use default value for timeout (undefined)');
</script>

View file

@ -1,7 +1,7 @@
<script>
'use strict';
new SMSReceiver().start().catch(error => {
navigator.sms.receive().catch(error => {
window.parent.postMessage({errorType: error.name}, '*');
});

View file

@ -20,38 +20,34 @@ let interceptor = (async function() {
})();
class SmsProvider {
constructor() {
this.returnValues = {}
}
getNextMessage(timeout) {
return this.handler.getNextMessage(timeout);
let call = this.returnValues.getNextMessage.shift();
if (!call) {
throw new Error("Unexpected call.");
}
setHandler(handler) {
this.handler = handler;
return call(timeout);
}
pushReturnValues(callName, returnValues) {
this.returnValues[callName] = this.returnValues[callName] || [];
this.returnValues[callName].push(returnValues);
return this;
}
setBinding(binding) {
this.binding = binding;
return this;
}
close() {
this.binding.close();
}
}
function getNextMessage(timeout, callback) {
throw new Error("expected to be overriden by tests");
}
async function close() {
let provider = await interceptor;
provider.close();
}
function expect(call) {
return {
async andReturn(callback) {
let handler = {};
handler[call.name] = callback;
let provider = await interceptor;
provider.setHandler(handler);
provider.pushReturnValues(call.name, callback);
}
}
}
@ -61,7 +57,8 @@ const Status = {};
function intercept() {
let provider = new SmsProvider();
let interceptor = new MojoInterfaceInterceptor(blink.mojom.SmsManager.$interfaceName);
let interceptor = new MojoInterfaceInterceptor(
blink.mojom.SmsManager.$interfaceName);
interceptor.oninterfacerequest = (e) => {
let impl = new blink.mojom.SmsManager(provider);
impl.bindHandle(e.handle);

View file

@ -1,3 +1,10 @@
[SecureContext]
interface mixin NavigatorSMS {
readonly attribute SMSReceiver sms;
};
Navigator includes NavigatorSMS;
[
SecureContext,
Exposed=(Window,DedicatedWorker)]
@ -11,10 +18,7 @@ dictionary SMSReceiverOptions {
[
SecureContext,
Exposed=(Window,DedicatedWorker),
Constructor(optional SMSReceiverOptions options)
] interface SMSReceiver : EventTarget {
readonly attribute SMS sms;
attribute EventHandler onchange;
Promise<void> start();
Exposed=Window
] interface SMSReceiver {
Promise<SMS> receive(optional SMSReceiverOptions options);
};

View file

@ -32,18 +32,6 @@ function modifies_relevant_files {
grep -E --silent '^(docs|tools)/'
}
if is_pull_request ; then
echo Submission comes from a pull request. Exiting without building.
exit ${neutral_status}
fi
if ! targets_master ; then
echo Submission does not target the 'master' branch. Exiting without building.
exit ${neutral_status}
fi
if ! modifies_relevant_files ; then
echo No files related to the website have been modified. Exiting without
echo building.
@ -78,6 +66,18 @@ touch .nojekyll
# Publish the website by pushing the built contents to the `gh-pages` branch
git add .
if is_pull_request ; then
echo Submission comes from a pull request. Exiting without publishing.
exit ${neutral_status}
fi
if ! targets_master ; then
echo Submission does not target the 'master' branch. Exiting without publishing.
exit ${neutral_status}
fi
if git diff --exit-code --quiet --staged ; then
echo No change to the website contents. Exiting without publishing.

View file

@ -26,9 +26,17 @@
non_strings.forEach(invalid_serialNumber => {
assert_throws(new TypeError, () => new NFCReadingEvent(
'message',
{invalid_serialNumber, message}
{serialNumber: invalid_serialNumber, message: message}
));
});
}, 'NFCReadingEvent constructor with non-string serialNumber');
}, 'NFCReadingEvent constructor with invalid serialNumber');
test(() => {
const message = createMessage([createJsonRecord(test_json_data)]);
const event = new NFCReadingEvent('type', {serialNumber: '', message: message});
assert_equals(event.type, 'type', 'type');
assert_equals(event.serialNumber, '', 'serialNumber');
assertWebNDEFMessagesEqual(event.message, message, 'message');
}, 'NFCReadingEvent constructor with valid parameters');
</script>

View file

@ -254,6 +254,9 @@ async function doSignalingHandshake(localPc, remotePc, options={}) {
// This should work for RTCSctpTransport, RTCDtlsTransport and RTCIceTransport.
function waitForState(transport, state) {
return new Promise((resolve, reject) => {
if (transport.state == state) {
resolve();
}
const eventHandler = () => {
if (transport.state == state) {
transport.removeEventListener('statechange', eventHandler, false);

View file

@ -277,4 +277,41 @@ async_test(t => {
closed
The RTCIceTransport has shut down and is no longer responding to STUN requests.
*/
for (let bundle_policy of ['balanced', 'max-bundle', 'max-compat']) {
promise_test(async t => {
const caller = new RTCPeerConnection({bundlePolicy: bundle_policy});
t.add_cleanup(() => caller.close());
const stream = await navigator.mediaDevices.getUserMedia(
{audio: true, video:true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track1, track2] = stream.getTracks();
const sender1 = caller.addTrack(track1);
const sender2 = caller.addTrack(track2);
caller.createDataChannel('datachannel');
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
coupleIceCandidates(caller, callee);
const offer = await caller.createOffer();
await caller.setLocalDescription(offer);
const [caller_transceiver1, caller_transceiver2] = caller.getTransceivers();
assert_equals(sender1.transport, caller_transceiver1.sender.transport);
await callee.setRemoteDescription(offer);
const [callee_transceiver1, callee_transceiver2] = callee.getTransceivers();
const answer = await callee.createAnswer();
await callee.setLocalDescription(answer);
await caller.setRemoteDescription(answer);
// At this point, we should have a single ICE transport, and it
// should eventually get to the "connected" state.
await waitForState(caller_transceiver1.receiver.transport.iceTransport,
'connected');
// The PeerConnection's iceConnectionState should therefore be 'connected'
assert_equals(caller.iceConnectionState, 'connected',
'PC.iceConnectionState:');
}, 'iceConnectionState changes at the right time, with bundle policy ' +
bundle_policy);
}
</script>

View file

@ -26,15 +26,36 @@ function iceGatheringCompleteWaiter(pc) {
return waiter;
}
class StateLogger {
constructor(source, eventname, field) {
source.addEventListener(eventname, event => {
this.events.push(source[field]);
});
this.events = [source[field]];
}
}
class IceStateLogger extends StateLogger {
constructor(source) {
super(source, 'iceconnectionstatechange', 'iceConnectionState');
}
}
promise_test(async t => {
const pc1 = new RTCPeerConnection();
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
t.add_cleanup(() => pc2.close());
pc1.createDataChannel('datachannel');
pc1IceStates = new IceStateLogger(pc1);
pc2IceStates = new IceStateLogger(pc1);
coupleIceCandidates(pc1, pc2);
await doSignalingHandshake(pc1, pc2);
await waitForIceStateChange(pc1, ['connected', 'completed']);
// Note - it's been claimed that this state sometimes jumps straight
// to "completed". If so, this test should be flaky.
await waitForIceStateChange(pc1, ['connected']);
assert_array_equals(pc1IceStates.events, ['new', 'checking', 'connected']);
assert_array_equals(pc2IceStates.events, ['new', 'checking', 'connected']);
}, 'Two way ICE exchange works');
promise_test(async t => {
@ -42,6 +63,8 @@ promise_test(async t => {
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
t.add_cleanup(() => pc2.close());
pc1IceStates = new IceStateLogger(pc1);
pc2IceStates = new IceStateLogger(pc1);
let candidates = [];
pc1.createDataChannel('datachannel');
pc1.onicecandidate = e => {
@ -62,6 +85,8 @@ promise_test(async t => {
const candidate_pair = pc1.sctp.transport.iceTransport.getSelectedCandidatePair();
assert_equals(candidate_pair.local.type, 'host');
assert_equals(candidate_pair.remote.type, 'prflx');
assert_array_equals(pc1IceStates.events, ['new', 'checking', 'connected']);
assert_array_equals(pc2IceStates.events, ['new', 'checking', 'connected']);
}, 'Adding only caller -> callee candidates gives a connection');
promise_test(async t => {
@ -69,6 +94,8 @@ promise_test(async t => {
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
t.add_cleanup(() => pc2.close());
pc1IceStates = new IceStateLogger(pc1);
pc2IceStates = new IceStateLogger(pc1);
let candidates = [];
pc1.createDataChannel('datachannel');
pc2.onicecandidate = e => {
@ -89,8 +116,92 @@ promise_test(async t => {
const candidate_pair = pc2.sctp.transport.iceTransport.getSelectedCandidatePair();
assert_equals(candidate_pair.local.type, 'host');
assert_equals(candidate_pair.remote.type, 'prflx');
assert_array_equals(pc1IceStates.events, ['new', 'checking', 'connected']);
assert_array_equals(pc2IceStates.events, ['new', 'checking', 'connected']);
}, 'Adding only callee -> caller candidates gives a connection');
promise_test(async t => {
const pc1 = new RTCPeerConnection();
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
t.add_cleanup(() => pc2.close());
pc1IceStates = new IceStateLogger(pc1);
pc2IceStates = new IceStateLogger(pc1);
let pc2ToPc1Candidates = [];
pc1.createDataChannel('datachannel');
pc2.onicecandidate = e => {
pc2ToPc1Candidates.push(e.candidate);
// This particular test verifies that candidates work
// properly if added from the pc2 onicecandidate event.
if (!e.candidate) {
for (const candidate of pc2ToPc1Candidates) {
if (candidate) {
pc1.addIceCandidate(candidate);
}
}
}
}
// Candidates from |pc1| are not delivered to |pc2|. |pc2| will use
// peer-reflexive candidates.
await doSignalingHandshake(pc1, pc2);
await Promise.all([waitForIceStateChange(pc1, ['connected', 'completed']),
waitForIceStateChange(pc2, ['connected', 'completed'])]);
const candidate_pair = pc2.sctp.transport.iceTransport.getSelectedCandidatePair();
assert_equals(candidate_pair.local.type, 'host');
assert_equals(candidate_pair.remote.type, 'prflx');
assert_array_equals(pc1IceStates.events, ['new', 'checking', 'connected']);
assert_array_equals(pc2IceStates.events, ['new', 'checking', 'connected']);
}, 'Adding callee -> caller candidates from end-of-candidates gives a connection');
promise_test(async t => {
const pc1 = new RTCPeerConnection();
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
t.add_cleanup(() => pc2.close());
pc1IceStates = new IceStateLogger(pc1);
pc2IceStates = new IceStateLogger(pc1);
let pc1ToPc2Candidates = [];
let pc2ToPc1Candidates = [];
pc1.createDataChannel('datachannel');
pc1.onicecandidate = e => {
pc1ToPc2Candidates.push(e.candidate);
}
pc2.onicecandidate = e => {
pc2ToPc1Candidates.push(e.candidate);
}
const offer = await pc1.createOffer();
await Promise.all([pc1.setLocalDescription(offer),
pc2.setRemoteDescription(offer)]);
const answer = await pc2.createAnswer();
await iceGatheringCompleteWaiter(pc1);
await pc2.setLocalDescription(answer).then(() => {
for (const candidate of pc1ToPc2Candidates) {
if (candidate) {
pc2.addIceCandidate(candidate);
}
}
});
await iceGatheringCompleteWaiter(pc2);
pc1.setRemoteDescription(answer).then(async () => {
for (const candidate of pc2ToPc1Candidates) {
if (candidate) {
await pc1.addIceCandidate(candidate);
}
}
});
await Promise.all([waitForIceStateChange(pc1, ['connected', 'completed']),
waitForIceStateChange(pc2, ['connected', 'completed'])]);
const candidate_pair =
pc1.sctp.transport.iceTransport.getSelectedCandidatePair();
assert_equals(candidate_pair.local.type, 'host');
// When we supply remote candidates, we expect a jump to the 'host' candidate,
// but it might also remain as 'prflx'.
assert_true(candidate_pair.remote.type == 'host' ||
candidate_pair.remote.type == 'prflx');
assert_array_equals(pc1IceStates.events, ['new', 'checking', 'connected']);
assert_array_equals(pc2IceStates.events, ['new', 'checking', 'connected']);
}, 'Explicit offer/answer exchange gives a connection');
</script>
</body>
</html>