mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
Auto merge of #20114 - servo-wpt-sync:wpt_update_23-02-2018, r=jdm
Sync WPT with upstream (23-02-2018) Automated downstream sync of changes from upstream as of 23-02-2018. [no-wpt-sync] <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/20114) <!-- Reviewable:end -->
This commit is contained in:
commit
615e38f186
69 changed files with 1716 additions and 112 deletions
|
@ -133,6 +133,12 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"accelerometer/LinearAccelerationSensor-shake-threshold-manual.https.html": [
|
||||
[
|
||||
"/accelerometer/LinearAccelerationSensor-shake-threshold-manual.https.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"accname/description_from_content_of_describedby_element-manual.html": [
|
||||
[
|
||||
"/accname/description_from_content_of_describedby_element-manual.html",
|
||||
|
@ -1105,6 +1111,24 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"clipboard-apis/copy-event-manual.html": [
|
||||
[
|
||||
"/clipboard-apis/copy-event-manual.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"clipboard-apis/cut-event-manual.html": [
|
||||
[
|
||||
"/clipboard-apis/cut-event-manual.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"clipboard-apis/paste-event-manual.html": [
|
||||
[
|
||||
"/clipboard-apis/paste-event-manual.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"console/console-count-logging-manual.html": [
|
||||
[
|
||||
"/console/console-count-logging-manual.html",
|
||||
|
@ -108417,6 +108441,78 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"css/css-flexbox/abspos-autopos-htb-ltr.html": [
|
||||
[
|
||||
"/css/css-flexbox/abspos-autopos-htb-ltr.html",
|
||||
[
|
||||
[
|
||||
"/css/reference/ref-filled-green-100px-square.xht",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-flexbox/abspos-autopos-htb-rtl.html": [
|
||||
[
|
||||
"/css/css-flexbox/abspos-autopos-htb-rtl.html",
|
||||
[
|
||||
[
|
||||
"/css/reference/ref-filled-green-100px-square.xht",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-flexbox/abspos-autopos-vlr-ltr.html": [
|
||||
[
|
||||
"/css/css-flexbox/abspos-autopos-vlr-ltr.html",
|
||||
[
|
||||
[
|
||||
"/css/reference/ref-filled-green-100px-square.xht",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-flexbox/abspos-autopos-vlr-rtl.html": [
|
||||
[
|
||||
"/css/css-flexbox/abspos-autopos-vlr-rtl.html",
|
||||
[
|
||||
[
|
||||
"/css/reference/ref-filled-green-100px-square.xht",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-flexbox/abspos-autopos-vrl-ltr.html": [
|
||||
[
|
||||
"/css/css-flexbox/abspos-autopos-vrl-ltr.html",
|
||||
[
|
||||
[
|
||||
"/css/reference/ref-filled-green-100px-square.xht",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-flexbox/abspos-autopos-vrl-rtl.html": [
|
||||
[
|
||||
"/css/css-flexbox/abspos-autopos-vrl-rtl.html",
|
||||
[
|
||||
[
|
||||
"/css/reference/ref-filled-green-100px-square.xht",
|
||||
"=="
|
||||
]
|
||||
],
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-flexbox/align-content-001.htm": [
|
||||
[
|
||||
"/css/css-flexbox/align-content-001.htm",
|
||||
|
@ -185322,6 +185418,11 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"./.pyup.yml": [
|
||||
[
|
||||
{}
|
||||
]
|
||||
],
|
||||
"./.travis.yml": [
|
||||
[
|
||||
{}
|
||||
|
@ -305730,6 +305831,12 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"WebIDL/ecmascript-binding/default-iterator-object.html": [
|
||||
[
|
||||
"/WebIDL/ecmascript-binding/default-iterator-object.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js": [
|
||||
[
|
||||
"/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.html",
|
||||
|
@ -305794,6 +305901,12 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"WebIDL/ecmascript-binding/iterator-prototype-object.html": [
|
||||
[
|
||||
"/WebIDL/ecmascript-binding/iterator-prototype-object.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"WebIDL/ecmascript-binding/legacy-callback-interface-object.html": [
|
||||
[
|
||||
"/WebIDL/ecmascript-binding/legacy-callback-interface-object.html",
|
||||
|
@ -306314,6 +306427,22 @@
|
|||
}
|
||||
]
|
||||
],
|
||||
"bluetooth/characteristic/service-same-from-2-characteristics.https.html": [
|
||||
[
|
||||
"/bluetooth/characteristic/service-same-from-2-characteristics.https.html",
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"bluetooth/characteristic/service-same-object.https.html": [
|
||||
[
|
||||
"/bluetooth/characteristic/service-same-object.https.html",
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html": [
|
||||
[
|
||||
"/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html",
|
||||
|
@ -306362,6 +306491,14 @@
|
|||
}
|
||||
]
|
||||
],
|
||||
"bluetooth/descriptor/readValue/read-succeeds.https.html": [
|
||||
[
|
||||
"/bluetooth/descriptor/readValue/read-succeeds.https.html",
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"bluetooth/descriptor/writeValue/gen-service-is-removed.https.html": [
|
||||
[
|
||||
"/bluetooth/descriptor/writeValue/gen-service-is-removed.https.html",
|
||||
|
@ -306370,12 +306507,52 @@
|
|||
}
|
||||
]
|
||||
],
|
||||
"bluetooth/device/gattserverdisconnected-event/disconnected.https.html": [
|
||||
[
|
||||
"/bluetooth/device/gattserverdisconnected-event/disconnected.https.html",
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.html": [
|
||||
[
|
||||
"/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.html",
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.html": [
|
||||
[
|
||||
"/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.html",
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.html": [
|
||||
[
|
||||
"/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.html",
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"bluetooth/idl/idl-Bluetooth.html": [
|
||||
[
|
||||
"/bluetooth/idl/idl-Bluetooth.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"bluetooth/idl/idl-BluetoothDevice.https.html": [
|
||||
[
|
||||
"/bluetooth/idl/idl-BluetoothDevice.https.html",
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"bluetooth/idl/idl-BluetoothUUID.html": [
|
||||
[
|
||||
"/bluetooth/idl/idl-BluetoothUUID.html",
|
||||
|
@ -307140,6 +307317,22 @@
|
|||
}
|
||||
]
|
||||
],
|
||||
"bluetooth/service/device-same-from-2-services.https.html": [
|
||||
[
|
||||
"/bluetooth/service/device-same-from-2-services.https.html",
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"bluetooth/service/device-same-object.https.html": [
|
||||
[
|
||||
"/bluetooth/service/device-same-object.https.html",
|
||||
{
|
||||
"testdriver": true
|
||||
}
|
||||
]
|
||||
],
|
||||
"bluetooth/service/getCharacteristic/characteristic-found.https.html": [
|
||||
[
|
||||
"/bluetooth/service/getCharacteristic/characteristic-found.https.html",
|
||||
|
@ -307640,6 +307833,12 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"content-security-policy/embedded-enforcement/required-csp-header-cascade.html": [
|
||||
[
|
||||
"/content-security-policy/embedded-enforcement/required-csp-header-cascade.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"content-security-policy/embedded-enforcement/required_csp-header.html": [
|
||||
[
|
||||
"/content-security-policy/embedded-enforcement/required_csp-header.html",
|
||||
|
@ -310676,6 +310875,12 @@
|
|||
}
|
||||
]
|
||||
],
|
||||
"css/css-animations/pending-style-changes-001.html": [
|
||||
[
|
||||
"/css/css-animations/pending-style-changes-001.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-backgrounds/background-331.html": [
|
||||
[
|
||||
"/css/css-backgrounds/background-331.html",
|
||||
|
@ -315724,12 +315929,24 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/background-color.html": [
|
||||
[
|
||||
"/css/css-typed-om/the-stylepropertymap/properties/background-color.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/background-image.html": [
|
||||
[
|
||||
"/css/css-typed-om/the-stylepropertymap/properties/background-image.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/border-color.html": [
|
||||
[
|
||||
"/css/css-typed-om/the-stylepropertymap/properties/border-color.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/border-style.html": [
|
||||
[
|
||||
"/css/css-typed-om/the-stylepropertymap/properties/border-style.html",
|
||||
|
@ -315748,6 +315965,24 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/caret-color.html": [
|
||||
[
|
||||
"/css/css-typed-om/the-stylepropertymap/properties/caret-color.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/color.html": [
|
||||
[
|
||||
"/css/css-typed-om/the-stylepropertymap/properties/color.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/column-rule-color.html": [
|
||||
[
|
||||
"/css/css-typed-om/the-stylepropertymap/properties/column-rule-color.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/display.html": [
|
||||
[
|
||||
"/css/css-typed-om/the-stylepropertymap/properties/display.html",
|
||||
|
@ -315784,6 +316019,12 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/outline-color.html": [
|
||||
[
|
||||
"/css/css-typed-om/the-stylepropertymap/properties/outline-color.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/padding.html": [
|
||||
[
|
||||
"/css/css-typed-om/the-stylepropertymap/properties/padding.html",
|
||||
|
@ -315808,12 +316049,24 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/text-decoration-color.html": [
|
||||
[
|
||||
"/css/css-typed-om/the-stylepropertymap/properties/text-decoration-color.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/text-decoration-style.html": [
|
||||
[
|
||||
"/css/css-typed-om/the-stylepropertymap/properties/text-decoration-style.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color.html": [
|
||||
[
|
||||
"/css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color.html",
|
||||
{}
|
||||
]
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/top.html": [
|
||||
[
|
||||
"/css/css-typed-om/the-stylepropertymap/properties/top.html",
|
||||
|
@ -388881,6 +389134,10 @@
|
|||
"525f7d93f00f11086aabc1f652cf06623e21986c",
|
||||
"support"
|
||||
],
|
||||
"./.pyup.yml": [
|
||||
"0f4dffbe91d06bbfce52245ea7ef8058d3f3a3b8",
|
||||
"support"
|
||||
],
|
||||
"./.travis.yml": [
|
||||
"975f331eb3438e5b66ccd721e1afce796b6af0d5",
|
||||
"support"
|
||||
|
@ -395249,6 +395506,10 @@
|
|||
"3d9564314c7ce59ce6a29dfa94c35e496e214bf5",
|
||||
"testharness"
|
||||
],
|
||||
"WebIDL/ecmascript-binding/default-iterator-object.html": [
|
||||
"1a7f8c61771a412544ef4a1aa187f5823615197f",
|
||||
"testharness"
|
||||
],
|
||||
"WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js": [
|
||||
"34432979f039c4e1ba4eb90d4f2acc96d1d441d8",
|
||||
"testharness"
|
||||
|
@ -395281,6 +395542,10 @@
|
|||
"13d2a9dbbd0d78e240c2b88d548f88ba41184e5f",
|
||||
"testharness"
|
||||
],
|
||||
"WebIDL/ecmascript-binding/iterator-prototype-object.html": [
|
||||
"60a872f6a82df3dc4438168ae4d0c3516ba03bba",
|
||||
"testharness"
|
||||
],
|
||||
"WebIDL/ecmascript-binding/legacy-callback-interface-object.html": [
|
||||
"4eac8c853a0627577d2bd96ed76c45bd187a5734",
|
||||
"testharness"
|
||||
|
@ -395781,6 +396046,10 @@
|
|||
"c82f9595dc2582b2da40549a358da1c3fc2ff820",
|
||||
"manual"
|
||||
],
|
||||
"accelerometer/LinearAccelerationSensor-shake-threshold-manual.https.html": [
|
||||
"30e8588ff49a1d526d65aac89bc80f4782715914",
|
||||
"manual"
|
||||
],
|
||||
"accelerometer/OWNERS": [
|
||||
"b119dbb984792f33c6e7463f3105d37c3c3b7ad8",
|
||||
"support"
|
||||
|
@ -398833,6 +399102,14 @@
|
|||
"b79a74ccf33bc76e6582ee7c1e2f3c277f99ddfb",
|
||||
"testharness"
|
||||
],
|
||||
"bluetooth/characteristic/service-same-from-2-characteristics.https.html": [
|
||||
"975aff2aff29d024b7afd73fc301244e490951a7",
|
||||
"testharness"
|
||||
],
|
||||
"bluetooth/characteristic/service-same-object.https.html": [
|
||||
"61955287698126b45ccc44f296b53a5876e23858",
|
||||
"testharness"
|
||||
],
|
||||
"bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html": [
|
||||
"97f5d01743721207c5addfb9625fd3da7c0c61e3",
|
||||
"testharness"
|
||||
|
@ -398857,10 +399134,30 @@
|
|||
"47f1bd316ae7d2637524a1b5d4436a3f11b20fd0",
|
||||
"testharness"
|
||||
],
|
||||
"bluetooth/descriptor/readValue/read-succeeds.https.html": [
|
||||
"dc7dd900f79a9205af3e904a309d565ae409afe9",
|
||||
"testharness"
|
||||
],
|
||||
"bluetooth/descriptor/writeValue/gen-service-is-removed.https.html": [
|
||||
"07c2dc0a081786302040942a989cc49f6b3fa3ca",
|
||||
"testharness"
|
||||
],
|
||||
"bluetooth/device/gattserverdisconnected-event/disconnected.https.html": [
|
||||
"ee14803683f17133c6147c2eaf250befbaaf0be1",
|
||||
"testharness"
|
||||
],
|
||||
"bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.html": [
|
||||
"6b4676f3b9b34ffa45ff616eb9d3c514e33ad471",
|
||||
"testharness"
|
||||
],
|
||||
"bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.html": [
|
||||
"a0fbabe94fe246c2031fe4baf30ba52b58a17b36",
|
||||
"testharness"
|
||||
],
|
||||
"bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.html": [
|
||||
"a66e1df2d870876d06ad0990ea523153539eff0e",
|
||||
"testharness"
|
||||
],
|
||||
"bluetooth/generate.py": [
|
||||
"ef112d89bc14d0e9ebbb457798609f6000a80935",
|
||||
"support"
|
||||
|
@ -398873,6 +399170,10 @@
|
|||
"9ef91a8214b3a46278d8b9b442b34d9052342342",
|
||||
"testharness"
|
||||
],
|
||||
"bluetooth/idl/idl-BluetoothDevice.https.html": [
|
||||
"b4c78ec760b61420a82f4a1a2951fb2eaa6af10d",
|
||||
"testharness"
|
||||
],
|
||||
"bluetooth/idl/idl-BluetoothUUID.html": [
|
||||
"4feb7657e77a18489bbe2d7a98405470c6ce0b82",
|
||||
"testharness"
|
||||
|
@ -399377,6 +399678,14 @@
|
|||
"60b7203a67f69acfd884f0b256dd7357fe717392",
|
||||
"testharness"
|
||||
],
|
||||
"bluetooth/service/device-same-from-2-services.https.html": [
|
||||
"e321ec75c308f64f29c7208e6b6769f7497d7cd7",
|
||||
"testharness"
|
||||
],
|
||||
"bluetooth/service/device-same-object.https.html": [
|
||||
"971c1836c90695bdb6b9ae76ef4f488b254c5e40",
|
||||
"testharness"
|
||||
],
|
||||
"bluetooth/service/getCharacteristic/characteristic-found.https.html": [
|
||||
"53479f342ef4aab9a24aaaa4580a63b5e6bcd30b",
|
||||
"testharness"
|
||||
|
@ -399533,6 +399842,18 @@
|
|||
"e69933ca4cdc42105d469b7ffb105aa60a8e0875",
|
||||
"manual"
|
||||
],
|
||||
"clipboard-apis/copy-event-manual.html": [
|
||||
"e81d71b8fd70ba571bbded9df62c460f5799b335",
|
||||
"manual"
|
||||
],
|
||||
"clipboard-apis/cut-event-manual.html": [
|
||||
"39f1e3f3f492a8da5fa00841b3a982ca4f47b14e",
|
||||
"manual"
|
||||
],
|
||||
"clipboard-apis/paste-event-manual.html": [
|
||||
"26ecfb7c87f732aab17cf1084440111153f5771f",
|
||||
"manual"
|
||||
],
|
||||
"common/OWNERS": [
|
||||
"13fbb201f77b9929d7f5693b70855c9b68abc70b",
|
||||
"support"
|
||||
|
@ -417677,8 +417998,12 @@
|
|||
"d5a253732352f46d33c1a58d1a3183a88daa3a75",
|
||||
"testharness"
|
||||
],
|
||||
"content-security-policy/embedded-enforcement/required-csp-header-cascade.html": [
|
||||
"94bb2f69cbef65ac9c062fe38990b5dcf4a5812c",
|
||||
"testharness"
|
||||
],
|
||||
"content-security-policy/embedded-enforcement/required_csp-header.html": [
|
||||
"b5c68072adf79a87b1371c34a9357a1507d6d981",
|
||||
"ad4636d3552abe07c662513a8b7673fa4e5f59d6",
|
||||
"testharness"
|
||||
],
|
||||
"content-security-policy/embedded-enforcement/subsumption_algorithm-general.html": [
|
||||
|
@ -417742,11 +418067,11 @@
|
|||
"support"
|
||||
],
|
||||
"content-security-policy/embedded-enforcement/support/echo-required-csp.py": [
|
||||
"3ece10b38406736c7ca5cd0c1b5fb9e8088ef655",
|
||||
"8d73332cdc154e05cdfa936d3f6b936b9c0ebdba",
|
||||
"support"
|
||||
],
|
||||
"content-security-policy/embedded-enforcement/support/testharness-helper.sub.js": [
|
||||
"01887343762a0f997ee59c8392a63d0a6101b1f9",
|
||||
"23feae559098474ba96b15f07619b9d7dba12dec",
|
||||
"support"
|
||||
],
|
||||
"content-security-policy/font-src/font-match-allowed.sub.html": [
|
||||
|
@ -480025,6 +480350,10 @@
|
|||
"d4692e2ac84a6dbbc9efd7937964d43ecd9dd109",
|
||||
"manual"
|
||||
],
|
||||
"css/css-animations/pending-style-changes-001.html": [
|
||||
"5f2bf4b6712dd230109be62407cd31800451a271",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-backgrounds/OWNERS": [
|
||||
"656d9f4e3a66f8cb955910171b9997140e4bbd8e",
|
||||
"support"
|
||||
|
@ -486361,6 +486690,30 @@
|
|||
"fe3aff8ac5243f870350d3a0eaa3393f93705c53",
|
||||
"support"
|
||||
],
|
||||
"css/css-flexbox/abspos-autopos-htb-ltr.html": [
|
||||
"d29f529c4d361705c3c5481f465e9e329ac7cb73",
|
||||
"reftest"
|
||||
],
|
||||
"css/css-flexbox/abspos-autopos-htb-rtl.html": [
|
||||
"02d905c849b93c526c4f60674177189e5851bcdb",
|
||||
"reftest"
|
||||
],
|
||||
"css/css-flexbox/abspos-autopos-vlr-ltr.html": [
|
||||
"849b20949f116f7876e09203a960a31c732ead22",
|
||||
"reftest"
|
||||
],
|
||||
"css/css-flexbox/abspos-autopos-vlr-rtl.html": [
|
||||
"7039b16d7789dca89df92092ee9e398fa7638c14",
|
||||
"reftest"
|
||||
],
|
||||
"css/css-flexbox/abspos-autopos-vrl-ltr.html": [
|
||||
"ab60d0e7d2ea15107a3c473fe700d8090fcbf9ec",
|
||||
"reftest"
|
||||
],
|
||||
"css/css-flexbox/abspos-autopos-vrl-rtl.html": [
|
||||
"7039b16d7789dca89df92092ee9e398fa7638c14",
|
||||
"reftest"
|
||||
],
|
||||
"css/css-flexbox/align-content-001.htm": [
|
||||
"fca8923c7a29229ae744af295a70533e306f3dd1",
|
||||
"reftest"
|
||||
|
@ -519433,10 +519786,18 @@
|
|||
"05e0be2c67fd695d693f2a639acf88ff78d8fd04",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/background-color.html": [
|
||||
"f52a2182afc7107a9f411a27aab81c4c4c90ef1e",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/background-image.html": [
|
||||
"1255fea8e74561e14720ccf422fd841e1d3e32fa",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/border-color.html": [
|
||||
"5b8adde602ac79d8b1ea92bd29f25d8756d72f8a",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/border-style.html": [
|
||||
"5d258827fb6a26d07efbdf5b47a440300f0aa307",
|
||||
"testharness"
|
||||
|
@ -519449,6 +519810,18 @@
|
|||
"e710943711544b28d07676df15966950c0d76efa",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/caret-color.html": [
|
||||
"d4139aeff755abe89ee1e04fcd34ccfba4efe91c",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/color.html": [
|
||||
"291f8e058d1fa6e342f4316c0760ec4cbdbc403c",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/column-rule-color.html": [
|
||||
"ec00a4b773f2ae421b8f688908925e28d2281614",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/display.html": [
|
||||
"26ba44d8d5146b9d606a1668659ee16876b371c5",
|
||||
"testharness"
|
||||
|
@ -519473,6 +519846,10 @@
|
|||
"3812b01e648e3b043abbd2fe82c3733309da49ad",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/outline-color.html": [
|
||||
"612e77914108dbba0b271b20eb3e9e80199349b3",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/padding.html": [
|
||||
"70c2e29badef7528469bcf11e1cb7bbc6cd519ea",
|
||||
"testharness"
|
||||
|
@ -519482,7 +519859,7 @@
|
|||
"testharness"
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/resources/testsuite.js": [
|
||||
"b0978c7b09302ce534bdf9e77d880610edbbe6ef",
|
||||
"a3df35f32209493e429282b89f4fdcc6581abe07",
|
||||
"support"
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/right.html": [
|
||||
|
@ -519493,10 +519870,18 @@
|
|||
"88a1f5866a767c25dec2ef75728c68c5631d371f",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/text-decoration-color.html": [
|
||||
"fe6d3765ca8fea1c1963a310d0aa35fa68089a9b",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/text-decoration-style.html": [
|
||||
"aa9698c5b4cb896fc43c58794df84ec0bbb0e3e9",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color.html": [
|
||||
"9419ab219034d1fb732965ebd3a03934bcaddf5a",
|
||||
"testharness"
|
||||
],
|
||||
"css/css-typed-om/the-stylepropertymap/properties/top.html": [
|
||||
"218b50f6b7d8209514bca8d0a8121263b07ab1e2",
|
||||
"testharness"
|
||||
|
@ -541954,7 +542339,7 @@
|
|||
"testharness"
|
||||
],
|
||||
"custom-elements/pseudo-class-defined.html": [
|
||||
"cf29756830dc12e60390c08486bbb3170c9c9c71",
|
||||
"9cef47df0d95c620f754c477609f6088059879a2",
|
||||
"testharness"
|
||||
],
|
||||
"custom-elements/reaction-timing.html": [
|
||||
|
@ -548654,7 +549039,7 @@
|
|||
"testharness"
|
||||
],
|
||||
"fullscreen/model/move-to-fullscreen-iframe-manual.html": [
|
||||
"0fc5409f5e44177e1153fb61c25506c05114dc35",
|
||||
"62aec7e1d5065bf99a00fc533c8c6d6704ac2010",
|
||||
"manual"
|
||||
],
|
||||
"fullscreen/model/move-to-iframe-manual.html": [
|
||||
|
@ -568494,7 +568879,7 @@
|
|||
"support"
|
||||
],
|
||||
"interfaces/geolocation-sensor.idl": [
|
||||
"158edb1945e5b3cefdb92953c6b3caf191d86986",
|
||||
"7f5defe8969fd21ed1b8eeaedc9a766cb4b695c1",
|
||||
"support"
|
||||
],
|
||||
"interfaces/geometry.idl": [
|
||||
|
@ -589098,7 +589483,7 @@
|
|||
"testharness"
|
||||
],
|
||||
"service-workers/service-worker/resource-timing.https.html": [
|
||||
"a835a0baeb4fcc0c44e6be28502f89308464acc5",
|
||||
"23cadb03b48a885dbbd9a5dfdc38b5b58f99d18a",
|
||||
"testharness"
|
||||
],
|
||||
"service-workers/service-worker/resources/404.py": [
|
||||
|
@ -589930,7 +590315,7 @@
|
|||
"support"
|
||||
],
|
||||
"service-workers/service-worker/resources/resource-timing-iframe.sub.html": [
|
||||
"c18c96a25dec48ae9d53359d4ca987ba857878a1",
|
||||
"75bd224a9680af0557c53fb6e77645e4e0b8173d",
|
||||
"support"
|
||||
],
|
||||
"service-workers/service-worker/resources/resource-timing-worker.js": [
|
||||
|
@ -598766,11 +599151,11 @@
|
|||
"testharness"
|
||||
],
|
||||
"webrtc/RTCDTMFSender-helper.js": [
|
||||
"205469a5d95d35c0cdc091afafa49ecaccac7e2d",
|
||||
"79825a416ad8e027628e80c9e0ef1a8dca2d8ca3",
|
||||
"support"
|
||||
],
|
||||
"webrtc/RTCDTMFSender-insertDTMF.https.html": [
|
||||
"50ef787a77512dc7eea7731b9766fda4d1456694",
|
||||
"591337627bf4bd0e40e6a5660efa9fc1e320d89f",
|
||||
"testharness"
|
||||
],
|
||||
"webrtc/RTCDTMFSender-ontonechange-long.https.html": [
|
||||
|
@ -598778,7 +599163,7 @@
|
|||
"testharness"
|
||||
],
|
||||
"webrtc/RTCDTMFSender-ontonechange.https.html": [
|
||||
"5d81b305d0b46f158e1533ffea648ae61f09c58a",
|
||||
"4f53cbc7fafeeed5202774b58d4bf721055b382e",
|
||||
"testharness"
|
||||
],
|
||||
"webrtc/RTCDataChannel-bufferedAmount.html": [
|
||||
|
@ -603742,11 +604127,11 @@
|
|||
"support"
|
||||
],
|
||||
"workers/data-url-shared.html": [
|
||||
"3650dbf419d8bbfe7380a36426793336998975cc",
|
||||
"7fae8fa78f0e66ffa8cf0dd1bf3e887fae349e4e",
|
||||
"testharness"
|
||||
],
|
||||
"workers/data-url.html": [
|
||||
"c693eac37e1a8856b82a923b2f1142360afc6411",
|
||||
"3de4925fb0a05ecf4da839dbf9b293c73a3c0354",
|
||||
"testharness"
|
||||
],
|
||||
"workers/interfaces.worker.js": [
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
[default-iterator-object.html]
|
||||
[Object.prototype.toString returns correct value]
|
||||
expected: FAIL
|
||||
|
||||
[@@toStringTag has correct value from prototype]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
[iterator-prototype-object.html]
|
||||
[Object.prototype.toString returns correct value]
|
||||
expected: FAIL
|
||||
|
||||
[@@toStringTag has correct value]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
[pending-style-changes-001.html]
|
||||
[Animatable::getAnimations() should be able to see a style-created CSS animation immediately]
|
||||
expected: FAIL
|
||||
|
||||
[Document::getAnimations() should be able to see a style-created CSS animation immediately]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
[abspos-autopos-htb-ltr.html]
|
||||
expected: FAIL
|
|
@ -0,0 +1,2 @@
|
|||
[abspos-autopos-htb-rtl.html]
|
||||
expected: FAIL
|
|
@ -0,0 +1,2 @@
|
|||
[abspos-autopos-vlr-ltr.html]
|
||||
expected: FAIL
|
|
@ -0,0 +1,2 @@
|
|||
[abspos-autopos-vlr-rtl.html]
|
||||
expected: FAIL
|
|
@ -0,0 +1,2 @@
|
|||
[abspos-autopos-vrl-ltr.html]
|
||||
expected: FAIL
|
|
@ -0,0 +1,2 @@
|
|||
[abspos-autopos-vrl-rtl.html]
|
||||
expected: FAIL
|
|
@ -1,2 +0,0 @@
|
|||
[vh_not_refreshing_on_chrome.html]
|
||||
expected: FAIL
|
|
@ -0,0 +1,4 @@
|
|||
[010.html]
|
||||
[Salvagability of document.opened document]
|
||||
expected: FAIL
|
||||
|
|
@ -30,3 +30,9 @@
|
|||
[A data: URL shared worker should not be shared among origins.]
|
||||
expected: FAIL
|
||||
|
||||
[indexedDB is present]
|
||||
expected: FAIL
|
||||
|
||||
[indexedDB is inaccessible]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -3,3 +3,6 @@
|
|||
[worker has opaque origin]
|
||||
expected: FAIL
|
||||
|
||||
[indexedDB is present]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,2 +1,3 @@
|
|||
[border_radius_elliptical_a.html]
|
||||
bug: https://github.com/servo/servo/issues/19271
|
||||
expected: FAIL
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
[hide_after_load.html]
|
||||
expected: TIMEOUT
|
2
tests/wpt/mozilla/meta/css/line_break_nowrap.html.ini
Normal file
2
tests/wpt/mozilla/meta/css/line_break_nowrap.html.ini
Normal file
|
@ -0,0 +1,2 @@
|
|||
[line_break_nowrap.html]
|
||||
expected: FAIL
|
|
@ -0,0 +1,2 @@
|
|||
[transition_calc_implicit.html]
|
||||
expected: TIMEOUT
|
|
@ -0,0 +1,2 @@
|
|||
[simple_scroll_to_fragment.html]
|
||||
expected: FAIL
|
40
tests/wpt/web-platform-tests/.pyup.yml
Normal file
40
tests/wpt/web-platform-tests/.pyup.yml
Normal file
|
@ -0,0 +1,40 @@
|
|||
# search for requirement files
|
||||
# default: True
|
||||
# allowed: True, False
|
||||
search: False
|
||||
|
||||
# Specify requirement files by hand, default is empty
|
||||
# default: empty
|
||||
# allowed: list
|
||||
requirements:
|
||||
- tools/wptrunner/requirements_chrome_android.txt:
|
||||
update: all
|
||||
pin: True
|
||||
- tools/wptrunner/requirements_edge.txt:
|
||||
update: all
|
||||
pin: True
|
||||
- tools/wptrunner/requirements_opera.txt:
|
||||
update: all
|
||||
pin: True
|
||||
- tools/wptrunner/requirements_servo.txt:
|
||||
update: all
|
||||
pin: True
|
||||
- tools/wptrunner/requirements_sauce.txt:
|
||||
update: all
|
||||
pin: True
|
||||
- tools/wptrunner/requirements_ie.txt:
|
||||
update: all
|
||||
pin: True
|
||||
- tools/wptrunner/requirements.txt:
|
||||
update: all
|
||||
pin: True
|
||||
- tools/wptrunner/requirements_firefox.txt:
|
||||
update: all
|
||||
pin: True
|
||||
- tools/wptrunner/requirements_chrome.txt:
|
||||
update: all
|
||||
pin: True
|
||||
- tools/wpt/requirements.txt:
|
||||
update: all
|
||||
pin: True
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>Default iterator objects</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
test(() => {
|
||||
const iterator1 = new URLSearchParams()[Symbol.iterator]();
|
||||
const iterator2 = new URLSearchParams().keys();
|
||||
const iterator3 = new URLSearchParams().values();
|
||||
const iterator4 = new URLSearchParams().entries();
|
||||
assert_equals(Object.getPrototypeOf(iterator1), Object.getPrototypeOf(iterator2));
|
||||
assert_equals(Object.getPrototypeOf(iterator1), Object.getPrototypeOf(iterator3));
|
||||
assert_equals(Object.getPrototypeOf(iterator1), Object.getPrototypeOf(iterator4));
|
||||
}, "Default iterator objects for an interface have the same prototype");
|
||||
|
||||
test(() => {
|
||||
const iterator = new URLSearchParams().entries();
|
||||
assert_equals(Object.prototype.toString.call(iterator), "[object URLSearchParams Iterator]");
|
||||
}, "Object.prototype.toString returns correct value");
|
||||
|
||||
test(() => {
|
||||
const iterator = new URLSearchParams().entries();
|
||||
assert_equals(iterator[Symbol.toStringTag], "URLSearchParams Iterator");
|
||||
assert_equals(Object.getOwnPropertyDescriptor(iterator, Symbol.toStringTag), undefined);
|
||||
}, "@@toStringTag has correct value from prototype");
|
||||
</script>
|
|
@ -0,0 +1,56 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>Iterator prototype objects</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script>
|
||||
test(() => {
|
||||
const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()));
|
||||
const iteratorProto = Object.getPrototypeOf(new URLSearchParams().entries());
|
||||
assert_equals(Object.getPrototypeOf(iteratorProto), esIteratorPrototype);
|
||||
}, "Has %IteratorPrototype% as prototype");
|
||||
|
||||
test(() => {
|
||||
const iteratorProto = Object.getPrototypeOf(new URLSearchParams().entries());
|
||||
const desc = Object.getOwnPropertyDescriptor(iteratorProto, "next");
|
||||
assert_equals(typeof desc.value, "function");
|
||||
assert_equals(desc.writable, true);
|
||||
assert_equals(desc.enumerable, true);
|
||||
assert_equals(desc.configurable, true);
|
||||
}, "next() exists and is writable, enumerable, and configurable");
|
||||
|
||||
test(() => {
|
||||
const usp = new URLSearchParams();
|
||||
const iteratorProto = Object.getPrototypeOf(usp.entries());
|
||||
|
||||
assert_throws(new TypeError(), () => {
|
||||
iteratorProto.next();
|
||||
});
|
||||
assert_throws(new TypeError(), () => {
|
||||
iteratorProto.next.call(undefined);
|
||||
});
|
||||
assert_throws(new TypeError(), () => {
|
||||
iteratorProto.next.call(42);
|
||||
});
|
||||
assert_throws(new TypeError(), () => {
|
||||
iteratorProto.next.call(new Headers().entries());
|
||||
});
|
||||
}, "next() throws TypeError when called on ineligible receiver");
|
||||
|
||||
test(() => {
|
||||
const iteratorProto = Object.getPrototypeOf(new URLSearchParams().entries());
|
||||
assert_equals(Object.prototype.toString.call(iteratorProto), "[object URLSearchParams Iterator]");
|
||||
}, "Object.prototype.toString returns correct value");
|
||||
|
||||
test(() => {
|
||||
const iteratorProto = Object.getPrototypeOf(new URLSearchParams().entries());
|
||||
assert_equals(Object.getOwnPropertyDescriptor(iteratorProto, Symbol.toStringTag).value, "URLSearchParams Iterator");
|
||||
// Property attributes have not yet been fully spec'd.
|
||||
}, "@@toStringTag has correct value");
|
||||
|
||||
test(() => {
|
||||
const iteratorProto1 = Object.getPrototypeOf(new URLSearchParams().entries());
|
||||
const iteratorProto2 = Object.getPrototypeOf(new Headers().entries());
|
||||
assert_not_equals(iteratorProto1, iteratorProto2);
|
||||
}, "Is specific to an interface");
|
||||
</script>
|
|
@ -0,0 +1,32 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>LinearAccelerationSensor Shake Threshold Test</title>
|
||||
<link rel="author" title="Intel" href="http://www.intel.com">
|
||||
<link rel="help" href="https://w3c.github.io/accelerometer/#examples">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<p class="instructions">
|
||||
Shake gesture along x axis of the device.
|
||||
</p>
|
||||
<script>
|
||||
|
||||
setup({explicit_timeout: true});
|
||||
|
||||
async_test(t => {
|
||||
const shakeThreshold = 25;
|
||||
const sensor = new LinearAccelerationSensor({frequency: 60});
|
||||
|
||||
sensor.onreading = t.step_func(() => {
|
||||
if (sensor.x > shakeThreshold) {
|
||||
t.done();
|
||||
}
|
||||
});
|
||||
|
||||
sensor.onerror = t.step_func_done(event => {
|
||||
assert_unreached(event.error.name + ":" + event.error.message);
|
||||
});
|
||||
|
||||
sensor.start();
|
||||
}, "Test that when shaking gesture along x axis of the device, the shake threshold can be greater than 25");
|
||||
|
||||
</script>
|
|
@ -0,0 +1,19 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
const test_desc = 'Same parent service returned from multiple characteristics.';
|
||||
|
||||
bluetooth_test(() => getHealthThermometerService()
|
||||
.then(({service}) => Promise.all([
|
||||
service.getCharacteristic('measurement_interval'),
|
||||
service.getCharacteristic('temperature_measurement')
|
||||
]))
|
||||
.then(characteristics =>
|
||||
assert_equals(characteristics[0].service, characteristics[1].service)),
|
||||
test_desc);
|
||||
</script>
|
|
@ -0,0 +1,16 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
const test_desc = '[SameObject] test for BluetoothRemoteGATTCharacteristic ' +
|
||||
'service.';
|
||||
|
||||
bluetooth_test(() => getMeasurementIntervalCharacteristic()
|
||||
.then(({characteristic}) =>
|
||||
assert_equals(characteristic.service, characteristic.service)),
|
||||
test_desc);
|
||||
</script>
|
|
@ -0,0 +1,21 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
const test_desc = 'A read request succeeds and returns the descriptor\'s value.';
|
||||
const EXPECTED_VALUE = [0, 1, 2];
|
||||
let descriptor, fake_descriptor;
|
||||
|
||||
bluetooth_test(() => getUserDescriptionDescriptor()
|
||||
.then(_ => ({descriptor, fake_descriptor} = _))
|
||||
.then(() =>
|
||||
fake_descriptor.setNextReadResponse(GATT_SUCCESS, EXPECTED_VALUE))
|
||||
.then(() => descriptor.readValue())
|
||||
.then(value => assert_array_equals(Array.from(new Uint8Array(
|
||||
value.buffer)), EXPECTED_VALUE)),
|
||||
test_desc);
|
||||
</script>
|
|
@ -0,0 +1,19 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
const test_desc = 'A device disconnecting while connected should fire the ' +
|
||||
'gattserverdisconnected event.';
|
||||
|
||||
bluetooth_test(() => getHealthThermometerDevice()
|
||||
.then(({device, fake_peripheral}) => {
|
||||
fake_peripheral.simulateGATTDisconnection();
|
||||
return eventPromise(device, 'gattserverdisconnected');
|
||||
})
|
||||
.then(e => assert_true(e.bubbles)),
|
||||
test_desc);
|
||||
</script>
|
|
@ -0,0 +1,24 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
const test_desc = 'A device disconnecting after the BluetoothDevice object ' +
|
||||
'has been GC\'ed should not access freed memory.';
|
||||
|
||||
bluetooth_test(() => getHealthThermometerDevice()
|
||||
.then(({fake_peripheral}) => {
|
||||
// 1. Disconnect.
|
||||
fake_peripheral.simulateGATTDisconnection();
|
||||
// 2. Run garbage collection.
|
||||
fake_peripheral = undefined;
|
||||
runGarbageCollection();
|
||||
})
|
||||
// 3. Wait 50ms after the GC runs for the disconnection event to come back.
|
||||
// There's nothing to assert other than that only valid memory is used.
|
||||
.then(() => new Promise(resolve => step_timeout(resolve, 50))),
|
||||
test_desc);
|
||||
</script>
|
|
@ -0,0 +1,32 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
const test_desc = 'If a site disconnects from a device while the platform is ' +
|
||||
'disconnecting that device, only one gattserverdisconnected event should ' +
|
||||
'fire.';
|
||||
let device, fake_peripheral;
|
||||
let num_events = 0;
|
||||
|
||||
bluetooth_test(() => getHealthThermometerDevice()
|
||||
.then(_ => ({device, fake_peripheral} = _))
|
||||
// 1. Listen for disconnections.
|
||||
.then(() =>
|
||||
device.addEventListener('gattserverdisconnected', () => num_events++))
|
||||
// 2. Disconnect several times.
|
||||
.then(() => Promise.all([
|
||||
eventPromise(device, 'gattserverdisconnected'),
|
||||
fake_peripheral.simulateGATTDisconnection(),
|
||||
device.gatt.disconnect(),
|
||||
device.gatt.disconnect(),
|
||||
]))
|
||||
// 3. Wait to catch disconnect events.
|
||||
.then(() => new Promise(resolve => step_timeout(resolve, 50)))
|
||||
// 4. Ensure there is exactly 1 disconnection recorded.
|
||||
.then(() => assert_equals(num_events, 1)),
|
||||
test_desc);
|
||||
</script>
|
|
@ -0,0 +1,34 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
let test_desc = 'A device that reconnects during the gattserverdisconnected ' +
|
||||
'event should still receive gattserverdisconnected events after ' +
|
||||
're-connection.';
|
||||
let device, fake_peripheral;
|
||||
bluetooth_test(() => getHealthThermometerDevice()
|
||||
.then(_ => ({device, fake_peripheral} = _))
|
||||
// 1. Disconnect.
|
||||
.then(() => new Promise(resolve => {
|
||||
fake_peripheral.simulateGATTDisconnection();
|
||||
device.addEventListener(
|
||||
'gattserverdisconnected', function onDisconnected() {
|
||||
device.removeEventListener('gattserverdisconnected', onDisconnected);
|
||||
// 2. Reconnect.
|
||||
fake_peripheral.setNextGATTConnectionResponse({
|
||||
code: HCI_SUCCESS,
|
||||
})
|
||||
.then(() => device.gatt.connect())
|
||||
.then(() => resolve());
|
||||
});
|
||||
}))
|
||||
// 3. Disconnect after reconnecting.
|
||||
.then(() => {
|
||||
fake_peripheral.simulateGATTDisconnection();
|
||||
return eventPromise(device, 'gattserverdisconnected')
|
||||
}), test_desc);
|
||||
</script>
|
|
@ -0,0 +1,31 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
const test_desc_idl = 'BluetoothDevice IDL test.';
|
||||
|
||||
test(() => {
|
||||
assert_throws(new TypeError(), () => new BluetoothDevice(),
|
||||
'the constructor should not be callable with "new"');
|
||||
assert_throws(new TypeError(), () => BluetoothDevice(),
|
||||
'the constructor should not be callable');
|
||||
}, test_desc_idl);
|
||||
|
||||
const test_desc_attr = 'BluetoothDevice attributes.';
|
||||
let device;
|
||||
bluetooth_test(() => getHealthThermometerDevice()
|
||||
.then(({device}) => {
|
||||
assert_equals(device.constructor.name, 'BluetoothDevice');
|
||||
var old_device_id = device.id;
|
||||
assert_throws(new TypeError(), () => device.id = 'overwritten',
|
||||
'the device id should not be writable');
|
||||
assert_throws(new TypeError(), () => device.name = 'overwritten',
|
||||
'the device name should not be writable');
|
||||
assert_equals(device.id, old_device_id);
|
||||
assert_equals(device.name, 'Health Thermometer');
|
||||
}), test_desc_attr);
|
||||
</script>
|
|
@ -0,0 +1,18 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
const test_desc = 'Same parent device returned from multiple services.';
|
||||
|
||||
bluetooth_test(() => getTwoHealthThermometerServicesDevice({
|
||||
filters: [{services: ['health_thermometer']}]
|
||||
})
|
||||
.then(({device}) => device.gatt.getPrimaryServices('health_thermometer'))
|
||||
.then(([service1, service2]) =>
|
||||
assert_equals(service1.device, service2.device)),
|
||||
test_desc);
|
||||
</script>
|
|
@ -0,0 +1,17 @@
|
|||
<!DOCTYPE html>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/testdriver.js"></script>
|
||||
<script src="/resources/testdriver-vendor.js"></script>
|
||||
<script src="/bluetooth/resources/bluetooth-helpers.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
const test_desc = '[SameObject] test for BluetoothRemoteGATTService device.';
|
||||
|
||||
bluetooth_test(() => getHealthThermometerDevice({
|
||||
filters: [{services: ['health_thermometer']}]
|
||||
})
|
||||
.then(({device}) => device.gatt.getPrimaryService('health_thermometer'))
|
||||
.then(service => assert_equals(service.device, service.device)),
|
||||
test_desc);
|
||||
</script>
|
|
@ -0,0 +1,19 @@
|
|||
<!DOCTYPE html>
|
||||
<title>The copy event</title>
|
||||
<link rel="help" href="https://w3c.github.io/clipboard-apis/#clipboard-event-copy">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id=log></div>
|
||||
<p>Select and copy any part of this text to continue.
|
||||
<script>
|
||||
setup({explicit_timeout: true});
|
||||
async_test(t => {
|
||||
document.oncopy = t.step_func_done(event => {
|
||||
// Nothing can be asserted about the event target until
|
||||
// https://github.com/w3c/clipboard-apis/issues/70 is resolved.
|
||||
// assert_equals(event.target, document.body, "event.target");
|
||||
assert_true(event.isTrusted, "event.isTrusted");
|
||||
assert_true(event.composed, "event.composed");
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,19 @@
|
|||
<!DOCTYPE html>
|
||||
<title>The cut event</title>
|
||||
<link rel="help" href="https://w3c.github.io/clipboard-apis/#clipboard-event-cut">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id=log></div>
|
||||
<input value="Select and cut any part of this text to continue" size="100">
|
||||
<script>
|
||||
setup({explicit_timeout: true});
|
||||
async_test(t => {
|
||||
document.oncut = t.step_func_done(event => {
|
||||
// Nothing can be asserted about the event target until
|
||||
// https://github.com/w3c/clipboard-apis/issues/70 is resolved.
|
||||
// assert_equals(event.target, document.body, "event.target");
|
||||
assert_true(event.isTrusted, "event.isTrusted");
|
||||
assert_true(event.composed, "event.composed");
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,21 @@
|
|||
<!DOCTYPE html>
|
||||
<title>The paste event</title>
|
||||
<link rel="help" href="https://w3c.github.io/clipboard-apis/#clipboard-event-paste">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id=log></div>
|
||||
<input placeholder="Paste any text here to continue" size="100">
|
||||
<p>Some pre-selected text to copy for convenience</p>
|
||||
<script>
|
||||
setup({explicit_timeout: true});
|
||||
async_test(t => {
|
||||
getSelection().selectAllChildren(document.querySelector("p"));
|
||||
document.onpaste = t.step_func_done(event => {
|
||||
// Nothing can be asserted about the event target until
|
||||
// https://github.com/w3c/clipboard-apis/issues/70 is resolved.
|
||||
// assert_equals(event.target, document.body, "event.target");
|
||||
assert_true(event.isTrusted, "event.isTrusted");
|
||||
assert_true(event.composed, "event.composed");
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,67 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Embedded Enforcement: Sec-Required-CSP header.</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="support/testharness-helper.sub.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<script>
|
||||
var tests = [
|
||||
{ "name": "Test same policy for both iframes",
|
||||
"csp1": "script-src 'unsafe-inline';",
|
||||
"csp2": "script-src 'unsafe-inline';",
|
||||
"expected1": "script-src 'unsafe-inline';",
|
||||
"expected2": "script-src 'unsafe-inline';"},
|
||||
{ "name": "Test more restrictive policy on second iframe",
|
||||
"csp1": "script-src 'unsafe-inline';",
|
||||
"csp2": "script-src 'unsafe-inline'; style-src 'self';",
|
||||
"expected1": "script-src 'unsafe-inline';",
|
||||
"expected2": "script-src 'unsafe-inline'; style-src 'self';"},
|
||||
{ "name": "Test less restrictive policy on second iframe",
|
||||
"csp1": "script-src 'unsafe-inline'; style-src 'self';",
|
||||
"csp2": "script-src 'unsafe-inline';",
|
||||
"expected1": "script-src 'unsafe-inline'; style-src 'self';",
|
||||
"expected2": "script-src 'unsafe-inline'; style-src 'self';"},
|
||||
{ "name": "Test no policy on second iframe",
|
||||
"csp1": "script-src 'unsafe-inline'; style-src 'self';",
|
||||
"csp2": "",
|
||||
"expected1": "script-src 'unsafe-inline'; style-src 'self';",
|
||||
"expected2": "script-src 'unsafe-inline'; style-src 'self';"},
|
||||
{ "name": "Test no policy on first iframe",
|
||||
"csp1": "",
|
||||
"csp2": "script-src 'unsafe-inline'; style-src 'self';",
|
||||
"expected1": null,
|
||||
"expected2": "script-src 'unsafe-inline'; style-src 'self';"},
|
||||
{ "name": "Test invalid policy on first iframe (bad directive)",
|
||||
"csp1": "default-src http://example.com; invalid-policy-name http://example.com",
|
||||
"csp2": "script-src 'unsafe-inline'; style-src 'self';",
|
||||
"expected1": null,
|
||||
"expected2": "script-src 'unsafe-inline'; style-src 'self';"},
|
||||
{ "name": "Test invalid policy on first iframe (report directive)",
|
||||
"csp1": "script-src 'unsafe-inline'; report-uri resources/dummy-report.php",
|
||||
"csp2": "script-src 'unsafe-inline'; style-src 'self';",
|
||||
"expected1": null,
|
||||
"expected2": "script-src 'unsafe-inline'; style-src 'self';"},
|
||||
{ "name": "Test invalid policy on second iframe (bad directive)",
|
||||
"csp1": "script-src 'unsafe-inline'; style-src 'self';",
|
||||
"csp2": "default-src http://example.com; invalid-policy-name http://example.com",
|
||||
"expected1": "script-src 'unsafe-inline'; style-src 'self';",
|
||||
"expected2": "script-src 'unsafe-inline'; style-src 'self';"},
|
||||
{ "name": "Test invalid policy on second iframe (report directive)",
|
||||
"csp1": "script-src 'unsafe-inline'; style-src 'self';",
|
||||
"csp2": "script-src 'unsafe-inline'; report-uri resources/dummy-report.php",
|
||||
"expected1": "script-src 'unsafe-inline'; style-src 'self';",
|
||||
"expected2": "script-src 'unsafe-inline'; style-src 'self';"},
|
||||
];
|
||||
|
||||
tests.forEach(test => {
|
||||
async_test(t => {
|
||||
var url = generateURLStringWithSecondIframeParams(Host.SAME_ORIGIN, PolicyHeader.REQUIRED_CSP, test.csp2);
|
||||
assert_required_csp(t, url, test.csp1, [test.expected1, test.expected2]);
|
||||
}, "Test same origin: " + test.name);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -58,25 +58,25 @@
|
|||
tests.forEach(test => {
|
||||
async_test(t => {
|
||||
var url = generateURLString(Host.SAME_ORIGIN, PolicyHeader.REQUIRED_CSP);
|
||||
assert_required_csp(t, url, test.csp, test.expected);
|
||||
assert_required_csp(t, url, test.csp, [test.expected]);
|
||||
}, "Test same origin: " + test.name);
|
||||
|
||||
async_test(t => {
|
||||
var url = generateURLString(Host.SAME_ORIGIN, PolicyHeader.REQUIRED_CSP);
|
||||
var redirect_url = generateRedirect(Host.SAME_ORIGIN, url);
|
||||
assert_required_csp(t, redirect_url, test.csp, test.expected);
|
||||
assert_required_csp(t, redirect_url, test.csp, [test.expected]);
|
||||
}, "Test same origin redirect: " + test.name);
|
||||
|
||||
async_test(t => {
|
||||
var url = generateURLString(Host.SAME_ORIGIN, PolicyHeader.REQUIRED_CSP);
|
||||
var redirect_url = generateRedirect(Host.CROSS_ORIGIN, url);
|
||||
assert_required_csp(t, redirect_url, test.csp, test.expected);
|
||||
assert_required_csp(t, redirect_url, test.csp, [test.expected]);
|
||||
}, "Test cross origin redirect: " + test.name);
|
||||
|
||||
async_test(t => {
|
||||
var url = generateURLString(Host.CROSS_ORIGIN, PolicyHeader.REQUIRED_CSP);
|
||||
var redirect_url = generateRedirect(Host.CROSS_ORIGIN, url);
|
||||
assert_required_csp(t, redirect_url, test.csp, test.expected);
|
||||
assert_required_csp(t, redirect_url, test.csp, [test.expected]);
|
||||
}, "Test cross origin redirect of cross origin iframe: " + test.name);
|
||||
|
||||
async_test(t => {
|
||||
|
|
|
@ -3,13 +3,37 @@ def main(request, response):
|
|||
header = request.headers.get("Sec-Required-CSP");
|
||||
message = {}
|
||||
message['required_csp'] = header if header else None
|
||||
second_level_iframe_code = ""
|
||||
if "include_second_level_iframe" in request.GET:
|
||||
if "second_level_iframe_csp" in request.GET and request.GET["second_level_iframe_csp"] <> "":
|
||||
second_level_iframe_code = '''<script>
|
||||
var i2 = document.createElement('iframe');
|
||||
i2.src = 'echo-required-csp.py';
|
||||
i2.csp = "{0}";
|
||||
document.body.appendChild(i2);
|
||||
</script>'''.format(request.GET["second_level_iframe_csp"])
|
||||
else:
|
||||
second_level_iframe_code = '''<script>
|
||||
var i2 = document.createElement('iframe');
|
||||
i2.src = 'echo-required-csp.py';
|
||||
document.body.appendChild(i2);
|
||||
</script>'''
|
||||
|
||||
return [("Content-Type", "text/html"), ("Allow-CSP-From", "*")], '''
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<!--{2}-->
|
||||
<script>
|
||||
window.addEventListener('message', function(e) {{
|
||||
window.parent.postMessage(e.data, '*');
|
||||
}});
|
||||
|
||||
window.parent.postMessage({0}, '*');
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
{1}
|
||||
</body>
|
||||
</html>
|
||||
'''.format(json.dumps(message))
|
||||
'''.format(json.dumps(message), second_level_iframe_code, str(request.headers))
|
||||
|
|
|
@ -34,16 +34,25 @@ function getSecureCrossOrigin() {
|
|||
return url.toString();
|
||||
}
|
||||
|
||||
function generateURL(host, path) {
|
||||
function generateURL(host, path, include_second_level_iframe, second_level_iframe_csp) {
|
||||
var url = new URL("http://{{host}}:{{ports[http][0]}}/content-security-policy/embedded-enforcement/support/");
|
||||
url.hostname = host == Host.SAME_ORIGIN ? "{{host}}" : "{{domains[天気の良い日]}}";
|
||||
url.pathname += path;
|
||||
if (include_second_level_iframe) {
|
||||
url.searchParams.append("include_second_level_iframe", "");
|
||||
if (second_level_iframe_csp)
|
||||
url.searchParams.append("second_level_iframe_csp", second_level_iframe_csp);
|
||||
}
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
function generateURLString(host, path) {
|
||||
return generateURL(host, path).toString();
|
||||
return generateURL(host, path, false, "").toString();
|
||||
}
|
||||
|
||||
function generateURLStringWithSecondIframeParams(host, path, second_level_iframe_csp) {
|
||||
return generateURL(host, path, true, second_level_iframe_csp).toString();
|
||||
}
|
||||
|
||||
function generateRedirect(host, target) {
|
||||
|
@ -77,8 +86,13 @@ function assert_required_csp(t, url, csp, expected) {
|
|||
window.addEventListener('message', t.step_func(e => {
|
||||
if (e.source != i.contentWindow || !('required_csp' in e.data))
|
||||
return;
|
||||
assert_equals(e.data['required_csp'], expected);
|
||||
t.done();
|
||||
|
||||
if (expected.indexOf(e.data['required_csp']) == -1)
|
||||
assert_unreached('Child iframes have unexpected csp:"' + e.data['required_csp'] + '"');
|
||||
|
||||
expected.splice(expected.indexOf(e.data['required_csp']), 1);
|
||||
if (expected.length == 0)
|
||||
t.done();
|
||||
}));
|
||||
|
||||
document.body.appendChild(i);
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
<meta charset=utf-8>
|
||||
<title>CSS Animations Test: requirement on pending style changes - getAnimations</title>
|
||||
<link rel="help" href="https://drafts.csswg.org/css-animations-2/#requirements-on-pending-style-changes">
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<style>
|
||||
@keyframes anim {}
|
||||
|
||||
.animate {
|
||||
animation: anim 10s;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="target"></div>
|
||||
|
||||
<script>
|
||||
test (t => {
|
||||
assert_equals(target.getAnimations().length, 0, 'Test precondition.');
|
||||
target.classList.add('animate');
|
||||
assert_equals(target.getAnimations().length, 1,
|
||||
'target.getAnimations() should include the CSS animation after animate class added.');
|
||||
target.classList.remove('animate');
|
||||
}, 'Animatable::getAnimations() should be able to see a style-created CSS animation immediately');
|
||||
|
||||
test(t => {
|
||||
assert_equals(document.getAnimations().length, 0, 'Test precondition.');
|
||||
target.classList.add('animate');
|
||||
assert_equals(document.getAnimations().length, 1,
|
||||
'document.getAnimations() should include the CSS animation after animate class added.');
|
||||
target.classList.remove('animate');
|
||||
}, 'Document::getAnimations() should be able to see a style-created CSS animation immediately');
|
||||
</script>
|
|
@ -0,0 +1,34 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Absolutely positioned child with auto position in vertical-rl ltr flexbox</title>
|
||||
<link rel="author" title="Morten Stenshorne" href="mstensho@chromium.org">
|
||||
<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#abs-non-replaced-width" title="10.3.7 Absolutely positioned, non-replaced elements">
|
||||
<link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#abspos-items" title="4.1. Absolutely-Positioned Flex Children">
|
||||
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||
<style>
|
||||
.flex {
|
||||
display: flex;
|
||||
position: relative;
|
||||
writing-mode: horizontal-tb;
|
||||
direction: ltr;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border: solid white;
|
||||
border-left-width: 20px;
|
||||
left: -20px;
|
||||
border-top-width: 5px;
|
||||
top: -5px;
|
||||
border-right-width: 10px;
|
||||
border-bottom-width: 15px;
|
||||
background: red;
|
||||
}
|
||||
.flex > div {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: green;
|
||||
}
|
||||
</style>
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
<div class="flex">
|
||||
<div></div>
|
||||
</div>
|
|
@ -0,0 +1,34 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Absolutely positioned child with auto position in vertical-rl ltr flexbox</title>
|
||||
<link rel="author" title="Morten Stenshorne" href="mstensho@chromium.org">
|
||||
<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#abs-non-replaced-width" title="10.3.7 Absolutely positioned, non-replaced elements">
|
||||
<link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#abspos-items" title="4.1. Absolutely-Positioned Flex Children">
|
||||
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||
<style>
|
||||
.flex {
|
||||
display: flex;
|
||||
position: relative;
|
||||
writing-mode: horizontal-tb;
|
||||
direction: rtl;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border: solid white;
|
||||
border-left-width: 20px;
|
||||
left: -20px;
|
||||
border-top-width: 5px;
|
||||
top: -5px;
|
||||
border-right-width: 10px;
|
||||
border-bottom-width: 15px;
|
||||
background: red;
|
||||
}
|
||||
.flex > div {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: green;
|
||||
}
|
||||
</style>
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
<div class="flex">
|
||||
<div></div>
|
||||
</div>
|
|
@ -0,0 +1,34 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Absolutely positioned child with auto position in vertical-rl ltr flexbox</title>
|
||||
<link rel="author" title="Morten Stenshorne" href="mstensho@chromium.org">
|
||||
<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#abs-non-replaced-width" title="10.3.7 Absolutely positioned, non-replaced elements">
|
||||
<link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#abspos-items" title="4.1. Absolutely-Positioned Flex Children">
|
||||
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||
<style>
|
||||
.flex {
|
||||
display: flex;
|
||||
position: relative;
|
||||
writing-mode: vertical-lr;
|
||||
direction: ltr;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border: solid white;
|
||||
border-left-width: 20px;
|
||||
left: -20px;
|
||||
border-top-width: 5px;
|
||||
top: -5px;
|
||||
border-right-width: 10px;
|
||||
border-bottom-width: 15px;
|
||||
background: red;
|
||||
}
|
||||
.flex > div {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: green;
|
||||
}
|
||||
</style>
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
<div class="flex">
|
||||
<div></div>
|
||||
</div>
|
|
@ -0,0 +1,34 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Absolutely positioned child with auto position in vertical-rl ltr flexbox</title>
|
||||
<link rel="author" title="Morten Stenshorne" href="mstensho@chromium.org">
|
||||
<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#abs-non-replaced-width" title="10.3.7 Absolutely positioned, non-replaced elements">
|
||||
<link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#abspos-items" title="4.1. Absolutely-Positioned Flex Children">
|
||||
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||
<style>
|
||||
.flex {
|
||||
display: flex;
|
||||
position: relative;
|
||||
writing-mode: vertical-lr;
|
||||
direction: rtl;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border: solid white;
|
||||
border-left-width: 20px;
|
||||
left: -20px;
|
||||
border-top-width: 5px;
|
||||
top: -5px;
|
||||
border-right-width: 10px;
|
||||
border-bottom-width: 15px;
|
||||
background: red;
|
||||
}
|
||||
.flex > div {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: green;
|
||||
}
|
||||
</style>
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
<div class="flex">
|
||||
<div></div>
|
||||
</div>
|
|
@ -0,0 +1,34 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Absolutely positioned child with auto position in vertical-rl ltr flexbox</title>
|
||||
<link rel="author" title="Morten Stenshorne" href="mstensho@chromium.org">
|
||||
<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#abs-non-replaced-width" title="10.3.7 Absolutely positioned, non-replaced elements">
|
||||
<link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#abspos-items" title="4.1. Absolutely-Positioned Flex Children">
|
||||
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||
<style>
|
||||
.flex {
|
||||
display: flex;
|
||||
position: relative;
|
||||
writing-mode: vertical-rl;
|
||||
direction: ltr;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border: solid white;
|
||||
border-left-width: 20px;
|
||||
left: -20px;
|
||||
border-top-width: 5px;
|
||||
top: -5px;
|
||||
border-right-width: 10px;
|
||||
border-bottom-width: 15px;
|
||||
background: red;
|
||||
}
|
||||
.flex > div {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: green;
|
||||
}
|
||||
</style>
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
<div class="flex">
|
||||
<div></div>
|
||||
</div>
|
|
@ -0,0 +1,34 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Absolutely positioned child with auto position in vertical-rl ltr flexbox</title>
|
||||
<link rel="author" title="Morten Stenshorne" href="mstensho@chromium.org">
|
||||
<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#abs-non-replaced-width" title="10.3.7 Absolutely positioned, non-replaced elements">
|
||||
<link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#abspos-items" title="4.1. Absolutely-Positioned Flex Children">
|
||||
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||
<style>
|
||||
.flex {
|
||||
display: flex;
|
||||
position: relative;
|
||||
writing-mode: vertical-lr;
|
||||
direction: rtl;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border: solid white;
|
||||
border-left-width: 20px;
|
||||
left: -20px;
|
||||
border-top-width: 5px;
|
||||
top: -5px;
|
||||
border-right-width: 10px;
|
||||
border-bottom-width: 15px;
|
||||
background: red;
|
||||
}
|
||||
.flex > div {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: green;
|
||||
}
|
||||
</style>
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
<div class="flex">
|
||||
<div></div>
|
||||
</div>
|
|
@ -0,0 +1,30 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>'background-color' property</title>
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../../resources/testhelper.js"></script>
|
||||
<script src="resources/testsuite.js"></script>
|
||||
<body>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
runPropertyTests('background-color', [
|
||||
{
|
||||
syntax: 'currentcolor',
|
||||
// computes to a <color>, which is not supported in level 1
|
||||
computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
|
||||
}
|
||||
]);
|
||||
|
||||
// <color>s are not supported in level 1
|
||||
runUnsupportedPropertyTests('background-color', [
|
||||
'red', '#bbff00', 'rgb(255, 255, 128)', 'hsl(50, 33%, 25%)',
|
||||
'transparent'
|
||||
]);
|
||||
|
||||
</script>
|
|
@ -0,0 +1,33 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>'border-color' properties</title>
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../../resources/testhelper.js"></script>
|
||||
<script src="resources/testsuite.js"></script>
|
||||
<body>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
for (const prefix of ['top', 'left', 'right', 'bottom']) {
|
||||
runPropertyTests(`border-${prefix}-color`, [
|
||||
{
|
||||
syntax: 'currentcolor',
|
||||
// computes to a <color>, which is not supported in level 1
|
||||
computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
|
||||
}
|
||||
]);
|
||||
|
||||
// <color>s are not supported in level 1
|
||||
runUnsupportedPropertyTests(`border-${prefix}-color`, [
|
||||
'red', '#bbff00', 'rgb(255, 255, 128)', 'hsl(50, 33%, 25%)',
|
||||
'transparent'
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
</script>
|
|
@ -0,0 +1,35 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>'caret-color' property</title>
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../../resources/testhelper.js"></script>
|
||||
<script src="resources/testsuite.js"></script>
|
||||
<body>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
runPropertyTests('caret-color', [
|
||||
{
|
||||
syntax: 'currentcolor',
|
||||
// computes to a <color>, which is not supported in level 1
|
||||
computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
|
||||
},
|
||||
{
|
||||
syntax: 'auto',
|
||||
// computes to a <color>, which is not supported in level 1
|
||||
computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
|
||||
}
|
||||
]);
|
||||
|
||||
// <color>s are not supported in level 1
|
||||
runUnsupportedPropertyTests('caret-color', [
|
||||
'red', '#bbff00', 'rgb(255, 255, 128)', 'hsl(50, 33%, 25%)',
|
||||
'transparent'
|
||||
]);
|
||||
|
||||
</script>
|
|
@ -0,0 +1,30 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>'color' property</title>
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../../resources/testhelper.js"></script>
|
||||
<script src="resources/testsuite.js"></script>
|
||||
<body>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
runPropertyTests('color', [
|
||||
{
|
||||
syntax: 'currentcolor',
|
||||
// computes to a <color>, which is not supported in level 1
|
||||
computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
|
||||
}
|
||||
]);
|
||||
|
||||
// <color>s are not supported in level 1
|
||||
runUnsupportedPropertyTests('color', [
|
||||
'red', '#bbff00', 'rgb(255, 255, 128)', 'hsl(50, 33%, 25%)',
|
||||
'transparent'
|
||||
]);
|
||||
|
||||
</script>
|
|
@ -0,0 +1,30 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>'column-rule-color' property</title>
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../../resources/testhelper.js"></script>
|
||||
<script src="resources/testsuite.js"></script>
|
||||
<body>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
runPropertyTests('column-rule-color', [
|
||||
{
|
||||
syntax: 'currentcolor',
|
||||
// computes to a <color>, which is not supported in level 1
|
||||
computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
|
||||
}
|
||||
]);
|
||||
|
||||
// <color>s are not supported in level 1
|
||||
runUnsupportedPropertyTests('column-rule-color', [
|
||||
'red', '#bbff00', 'rgb(255, 255, 128)', 'hsl(50, 33%, 25%)',
|
||||
'transparent'
|
||||
]);
|
||||
|
||||
</script>
|
|
@ -0,0 +1,31 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>'outline-color' property</title>
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../../resources/testhelper.js"></script>
|
||||
<script src="resources/testsuite.js"></script>
|
||||
<body>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
runPropertyTests('outline-color', [
|
||||
{
|
||||
syntax: 'currentcolor',
|
||||
// computes to a <color>, which is not supported in level 1
|
||||
computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
|
||||
}
|
||||
// FIXME: browsers may or may not support 'invert' keyword.
|
||||
]);
|
||||
|
||||
// <color>s are not supported in level 1
|
||||
runUnsupportedPropertyTests('outline-color', [
|
||||
'red', '#bbff00', 'rgb(255, 255, 128)', 'hsl(50, 33%, 25%)',
|
||||
'transparent'
|
||||
]);
|
||||
|
||||
</script>
|
|
@ -228,6 +228,25 @@ function testPropertyInvalid(propertyName, examples, description) {
|
|||
}, `Setting '${propertyName}' to ${description} throws TypeError`);
|
||||
}
|
||||
|
||||
// Test that styleMap.get/.set roundtrips correctly for unsupported values.
|
||||
function testUnsupportedValue(propertyName, cssText) {
|
||||
test(t => {
|
||||
let element1 = createDivWithStyle(t);
|
||||
let element2 = createDivWithStyle(t);
|
||||
|
||||
element1.style[propertyName] = cssText;
|
||||
const result = element1.attributeStyleMap.get(propertyName);
|
||||
assert_not_equals(result, null,
|
||||
'Unsupported value must not be null');
|
||||
assert_class_string(result, 'CSSStyleValue',
|
||||
'Unsupported value must be a CSSStyleValue and not one of its subclasses');
|
||||
|
||||
element2.attributeStyleMap.set(propertyName, result);
|
||||
assert_equals(element2.style[propertyName], element1.style[propertyName],
|
||||
'Unsupported value can be set on different element');
|
||||
}, `'${propertyName}' does not supported '${cssText}'`);
|
||||
}
|
||||
|
||||
function createKeywordExample(keyword) {
|
||||
return {
|
||||
description: `the '${keyword}' keyword`,
|
||||
|
@ -297,3 +316,13 @@ function runPropertyTests(propertyName, testCases) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check that |propertyName| doesn't "support" examples in |testExamples|.
|
||||
// |testExamples| is a list of CSS string values. An "unsupported" value
|
||||
// doesn't have a corresponding Typed OM representation. It normalizes as
|
||||
// the base CSSStyleValue.
|
||||
function runUnsupportedPropertyTests(propertyName, testExamples) {
|
||||
for (const cssText of testExamples) {
|
||||
testUnsupportedValue(propertyName, cssText);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>'text-decoration-color' property</title>
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../../resources/testhelper.js"></script>
|
||||
<script src="resources/testsuite.js"></script>
|
||||
<body>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
runPropertyTests('text-decoration-color', [
|
||||
{
|
||||
syntax: 'currentcolor',
|
||||
// computes to a <color>, which is not supported in level 1
|
||||
computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
|
||||
}
|
||||
]);
|
||||
|
||||
// <color>s are not supported in level 1
|
||||
runUnsupportedPropertyTests('text-decoration-color', [
|
||||
'red', '#bbff00', 'rgb(255, 255, 128)', 'hsl(50, 33%, 25%)',
|
||||
'transparent'
|
||||
]);
|
||||
|
||||
</script>
|
|
@ -0,0 +1,30 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>'text-emphasis-color' property</title>
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-get">
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#dom-stylepropertymap-set">
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#property-stle-value-normalization">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="../../resources/testhelper.js"></script>
|
||||
<script src="resources/testsuite.js"></script>
|
||||
<body>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
runPropertyTests('text-emphasis-color', [
|
||||
{
|
||||
syntax: 'currentcolor',
|
||||
// computes to a <color>, which is not supported in level 1
|
||||
computed: (_, result) => assert_class_string(result, 'CSSStyleValue')
|
||||
}
|
||||
]);
|
||||
|
||||
// <color>s are not supported in level 1
|
||||
runUnsupportedPropertyTests('text-emphasis-color', [
|
||||
'red', '#bbff00', 'rgb(255, 255, 128)', 'hsl(50, 33%, 25%)',
|
||||
'transparent'
|
||||
]);
|
||||
|
||||
</script>
|
|
@ -9,6 +9,7 @@ const testList = [
|
|||
{ tag_name: 'a-a', defined: false },
|
||||
{ tag_name: 'font-face', defined: true },
|
||||
{ tag_name: 'abbr', is: 'my-abbr', defined: false },
|
||||
{ tag_name: 'p', is: '', defined: false },
|
||||
];
|
||||
|
||||
// Setup iframe to test the parser.
|
||||
|
@ -20,7 +21,7 @@ iframe.srcdoc = `<style>
|
|||
:defined { color:${defined}; }
|
||||
:not(:defined) { color:${not_defined}; }
|
||||
</style>`
|
||||
+ testList.map(d => `<${d.tag_name}${d.is ? ' is=' + d.is : ''}></${d.tag_name}>`).join('');
|
||||
+ testList.map(d => `<${d.tag_name}${d.is !== undefined ? ' is=' + d.is : ''}></${d.tag_name}>`).join('');
|
||||
setup({ explicit_done: true });
|
||||
iframe.onload = () => {
|
||||
const doc = iframe.contentDocument;
|
||||
|
@ -31,7 +32,8 @@ iframe.onload = () => {
|
|||
`<${data.tag_name}${data.is ? ' is=' + data.is : ''}>`);
|
||||
|
||||
// Test DOM createElement() methods.
|
||||
test_defined_for_createElement(data.defined, !data.defined, doc, data.tag_name, data.is);
|
||||
let try_upgrade = !data.defined && (data.is === undefined || data.is.length > 0);
|
||||
test_defined_for_createElement(data.defined, try_upgrade, doc, data.tag_name, data.is);
|
||||
|
||||
// Documents without browsing context should behave the same.
|
||||
test_defined_for_createElement(data.defined, false, doc_without_browsing_context, data.tag_name, data.is, 'Without browsing context: ');
|
||||
|
@ -41,21 +43,22 @@ iframe.onload = () => {
|
|||
};
|
||||
|
||||
function test_defined_for_createElement(defined, should_test_change, doc, tag_name, is, description = '') {
|
||||
let is_desc = is ? `, { is: "${is}" }` : '';
|
||||
let has_is = is !== undefined;
|
||||
let is_desc = has_is ? `, { is: "${is}" }` : '';
|
||||
// Test document.createElement().
|
||||
let element = is ? doc.createElement(tag_name, { is: is }) : doc.createElement(tag_name);
|
||||
let element = has_is ? doc.createElement(tag_name, { is: is }) : doc.createElement(tag_name);
|
||||
doc.body.appendChild(element);
|
||||
test_defined(defined, element, `${description}createElement("${tag_name}"${is_desc})`);
|
||||
|
||||
// Test document.createElementNS().
|
||||
let html_element = is ? doc.createElementNS('http://www.w3.org/1999/xhtml', tag_name, { is: is })
|
||||
: doc.createElementNS('http://www.w3.org/1999/xhtml', tag_name);
|
||||
let html_element = has_is ? doc.createElementNS('http://www.w3.org/1999/xhtml', tag_name, { is: is })
|
||||
: doc.createElementNS('http://www.w3.org/1999/xhtml', tag_name);
|
||||
doc.body.appendChild(html_element);
|
||||
test_defined(defined, html_element, `${description}createElementNS("http://www.w3.org/1999/xhtml", "${tag_name}"${is_desc})`);
|
||||
|
||||
// If the element namespace is not HTML, it should be "uncustomized"; i.e., "defined".
|
||||
let svg_element = is ? doc.createElementNS('http://www.w3.org/2000/svg', tag_name, { is: is })
|
||||
: doc.createElementNS('http://www.w3.org/2000/svg', tag_name);
|
||||
let svg_element = has_is ? doc.createElementNS('http://www.w3.org/2000/svg', tag_name, { is: is })
|
||||
: doc.createElementNS('http://www.w3.org/2000/svg', tag_name);
|
||||
doc.body.appendChild(svg_element);
|
||||
test_defined(true, svg_element, `${description}createElementNS("http://www.w3.org/2000/svg", "${tag_name}"${is_desc})`);
|
||||
|
||||
|
|
|
@ -12,6 +12,8 @@ async_test(t => {
|
|||
// Enter fullscreen for the iframe's body element.
|
||||
trusted_request(t, iframeDoc.body, document.body);
|
||||
document.onfullscreenchange = t.step_func(() => {
|
||||
assert_equals(document.fullscreenElement, iframe, "document's initial fullscreen element");
|
||||
assert_equals(iframeDoc.fullscreenElement, iframeDoc.body, "iframe's initial fullscreen element");
|
||||
|
||||
// Then, move the outer document's body into the iframe. This is an unusual
|
||||
// thing to do, but means that the iframe is removed from its document and
|
||||
|
@ -20,12 +22,15 @@ async_test(t => {
|
|||
|
||||
// If we exit in an orderly fashion, that's all one can ask for.
|
||||
document.onfullscreenchange = t.step_func_done(() => {
|
||||
assert_equals(document.fullscreenElement, null, "document's fullscreen element");
|
||||
assert_equals(document.fullscreenElement, null, "document's final fullscreen element");
|
||||
|
||||
// the iframe's contentDocument has become undefined, but the reference
|
||||
// we're holding on to should not have a fullscreen element either.
|
||||
assert_equals(iframe.contentDocuemnt, undefined, "iframe's content document");
|
||||
assert_equals(iframeDoc.fullscreenElement, null, "iframe's fullscreen element");
|
||||
// Because the iframe was removed, its browsing context was discarded and
|
||||
// its contentDocument has become null. Because that browsing context was
|
||||
// neither a descendant browsing context nor had an active document,
|
||||
// nothing at all was done with it in the exit fullscreen algorithm, so
|
||||
// its fullscreenElement is unchanged.
|
||||
assert_equals(iframe.contentDocument, null, "iframe's content document");
|
||||
assert_equals(iframeDoc.fullscreenElement, iframeDoc.body, "iframe's final fullscreen element");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
[Constructor(optional SensorOptions options), SecureContext, Exposed=Window]
|
||||
[Constructor(optional GeolocationSensorOptions options), SecureContext, Exposed=Window]
|
||||
interface GeolocationSensor : Sensor {
|
||||
static Promise<GeolocationSensorReading> read(optional ReadOptions readOptions);
|
||||
readonly attribute unrestricted double? latitude;
|
||||
readonly attribute unrestricted double? longitude;
|
||||
readonly attribute unrestricted double? altitude;
|
||||
|
@ -8,3 +9,22 @@ interface GeolocationSensor : Sensor {
|
|||
readonly attribute unrestricted double? heading;
|
||||
readonly attribute unrestricted double? speed;
|
||||
};
|
||||
|
||||
dictionary GeolocationSensorOptions : SensorOptions {
|
||||
// placeholder for GeolocationSensor-specific options
|
||||
};
|
||||
|
||||
dictionary ReadOptions : GeolocationSensorOptions {
|
||||
AbortSignal? signal;
|
||||
};
|
||||
|
||||
dictionary GeolocationSensorReading {
|
||||
DOMHighResTimeStamp? timestamp;
|
||||
double? latitude;
|
||||
double? longitude;
|
||||
double? altitude;
|
||||
double? accuracy;
|
||||
double? altitudeAccuracy;
|
||||
double? heading;
|
||||
double? speed;
|
||||
};
|
||||
|
|
|
@ -12,28 +12,33 @@ function crossOriginUrl(path) {
|
|||
return get_host_info()['HTTPS_REMOTE_ORIGIN'] + base_path() + path;
|
||||
}
|
||||
|
||||
function verify(performance, resource, mode, description) {
|
||||
var url = mode === 'cross-origin' ? crossOriginUrl(resource)
|
||||
: resourceUrl(resource);
|
||||
var entryList = performance.getEntries();
|
||||
var entry = performance.getEntriesByName(url)[0];
|
||||
assert_greater_than(entry.workerStart, 0, description);
|
||||
assert_greater_than_equal(entry.workerStart, entry.startTime, description);
|
||||
assert_less_than_equal(entry.workerStart, entry.fetchStart, description);
|
||||
if (mode === 'cross-origin') {
|
||||
assert_equals(entry.responseStart, 0, description);
|
||||
assert_greater_than_equal(entry.responseEnd, entry.fetchStart, description);
|
||||
} else {
|
||||
assert_greater_than_equal(entry.responseStart, entry.fetchStart, description);
|
||||
assert_greater_than_equal(entry.responseEnd, entry.responseStart, description);
|
||||
function verify(options) {
|
||||
var url = options.mode === 'cross-origin' ? crossOriginUrl(options.resource)
|
||||
: resourceUrl(options.resource);
|
||||
var entryList = options.performance.getEntriesByName(url);
|
||||
if (entryList.length === 0 && options.allow_no_performance_entry) {
|
||||
// The performance timeline may not have an entry for a resource
|
||||
// which failed to load.
|
||||
return;
|
||||
}
|
||||
assert_greater_than(entry.responseEnd, entry.fetchStart, description);
|
||||
assert_greater_than(entry.duration, 0, description);
|
||||
if (resource.indexOf('redirect.py') != -1) {
|
||||
assert_less_than_equal(entry.workerStart, entry.redirectStart,
|
||||
description);
|
||||
var entry = entryList[0];
|
||||
assert_greater_than(entry.workerStart, 0, options.description);
|
||||
assert_greater_than_equal(entry.workerStart, entry.startTime, options.description);
|
||||
assert_less_than_equal(entry.workerStart, entry.fetchStart, options.description);
|
||||
if (options.mode === 'cross-origin') {
|
||||
assert_equals(entry.responseStart, 0, options.description);
|
||||
assert_greater_than_equal(entry.responseEnd, entry.fetchStart, options.description);
|
||||
} else {
|
||||
assert_equals(entry.redirectStart, 0, description);
|
||||
assert_greater_than_equal(entry.responseStart, entry.fetchStart, options.description);
|
||||
assert_greater_than_equal(entry.responseEnd, entry.responseStart, options.description);
|
||||
}
|
||||
assert_greater_than(entry.responseEnd, entry.fetchStart, options.description);
|
||||
assert_greater_than(entry.duration, 0, options.description);
|
||||
if (options.resource.indexOf('redirect.py') != -1) {
|
||||
assert_less_than_equal(entry.workerStart, entry.redirectStart,
|
||||
options.description);
|
||||
} else {
|
||||
assert_equals(entry.redirectStart, 0, options.description);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -52,19 +57,54 @@ async_test(function(t) {
|
|||
})
|
||||
.then(function(frame) {
|
||||
var performance = frame.contentWindow.performance;
|
||||
verify(performance, 'resources/dummy.js', 'same-origin',
|
||||
'Generated response');
|
||||
verify(performance, 'resources/empty.js', 'same-origin',
|
||||
'Network fallback');
|
||||
verify(performance, 'resources/redirect.py?Redirect=empty.js',
|
||||
'same-origin', 'Redirect');
|
||||
verify(performance, 'resources/missing.jpg', 'same-origin',
|
||||
'Network fallback image');
|
||||
|
||||
verify({
|
||||
performance: performance,
|
||||
resource: 'resources/dummy.js',
|
||||
mode: 'same-origin',
|
||||
description: 'Generated response',
|
||||
});
|
||||
verify({
|
||||
performance: performance,
|
||||
resource: 'resources/empty.js',
|
||||
mode: 'same-origin',
|
||||
description: 'Network fallback',
|
||||
});
|
||||
verify({
|
||||
performance: performance,
|
||||
resource: 'resources/redirect.py?Redirect=empty.js',
|
||||
mode: 'same-origin',
|
||||
description: 'Redirect',
|
||||
});
|
||||
verify({
|
||||
performance: performance,
|
||||
resource: 'resources/square.png',
|
||||
mode: 'same-origin',
|
||||
description: 'Network fallback image',
|
||||
});
|
||||
// Test that worker start is available on cross-origin no-cors
|
||||
// subresources.
|
||||
verify(performance, 'resources/missing.jpg', 'cross-origin',
|
||||
'Network fallback cross-origin image');
|
||||
verify({
|
||||
performance: performance,
|
||||
resource: 'resources/square.png',
|
||||
mode: 'cross-origin',
|
||||
description: 'Network fallback cross-origin image',
|
||||
});
|
||||
|
||||
// Tests for resouces which failed to load.
|
||||
verify({
|
||||
performance: performance,
|
||||
resource: 'resources/missing.jpg',
|
||||
mode: 'same-origin',
|
||||
description: 'Network fallback load failure',
|
||||
allow_no_performance_entry: true,
|
||||
});
|
||||
verify({
|
||||
performance: performance,
|
||||
resource: 'resources/missing.jpg',
|
||||
mode: 'cross-origin',
|
||||
description: 'Network fallback cross-origin load failure',
|
||||
allow_no_performance_entry: true,
|
||||
});
|
||||
|
||||
frame.remove();
|
||||
return registration.unregister();
|
||||
|
|
|
@ -2,5 +2,7 @@
|
|||
<script src="empty.js"></script>
|
||||
<script src="dummy.js"></script>
|
||||
<script src="redirect.py?Redirect=empty.js"></script>
|
||||
<img src="square.png">
|
||||
<img src="https://{{domains[www1]}}:{{ports[https][0]}}/service-workers/service-worker/resources/square.png">
|
||||
<img src="missing.jpg">
|
||||
<img src="https://{{domains[www1]}}:{{ports[https][0]}}/service-workers/service-worker/resources/missing.jpg">
|
||||
|
|
|
@ -211,7 +211,7 @@ class Firefox(Browser):
|
|||
class Chrome(Browser):
|
||||
"""Chrome-specific interface.
|
||||
|
||||
Includes installation, webdriver installation, and wptrunner setup methods.
|
||||
Includes webdriver installation, and wptrunner setup methods.
|
||||
"""
|
||||
|
||||
product = "chrome"
|
||||
|
@ -284,9 +284,9 @@ class Chrome(Browser):
|
|||
|
||||
|
||||
class ChromeAndroid(Browser):
|
||||
"""Chrome-specific interface for android.
|
||||
"""Chrome-specific interface for Android.
|
||||
|
||||
Includes installation, webdriver installation, and wptrunner setup methods.
|
||||
Includes webdriver installation.
|
||||
"""
|
||||
|
||||
product = "chrome_android"
|
||||
|
@ -309,7 +309,7 @@ class ChromeAndroid(Browser):
|
|||
class Opera(Browser):
|
||||
"""Opera-specific interface.
|
||||
|
||||
Includes installation, webdriver installation, and wptrunner setup methods.
|
||||
Includes webdriver installation, and wptrunner setup methods.
|
||||
"""
|
||||
|
||||
product = "opera"
|
||||
|
@ -386,10 +386,7 @@ class Opera(Browser):
|
|||
|
||||
|
||||
class Edge(Browser):
|
||||
"""Edge-specific interface.
|
||||
|
||||
Includes installation, webdriver installation, and wptrunner setup methods.
|
||||
"""
|
||||
"""Edge-specific interface."""
|
||||
|
||||
product = "edge"
|
||||
requirements = "requirements_edge.txt"
|
||||
|
@ -409,10 +406,7 @@ class Edge(Browser):
|
|||
|
||||
|
||||
class InternetExplorer(Browser):
|
||||
"""Internet Explorer-specific interface.
|
||||
|
||||
Includes installation, webdriver installation, and wptrunner setup methods.
|
||||
"""
|
||||
"""Internet Explorer-specific interface."""
|
||||
|
||||
product = "ie"
|
||||
requirements = "requirements_ie.txt"
|
||||
|
@ -432,10 +426,7 @@ class InternetExplorer(Browser):
|
|||
|
||||
|
||||
class Servo(Browser):
|
||||
"""Servo-specific interface.
|
||||
|
||||
Includes installation, webdriver installation, and wptrunner setup methods.
|
||||
"""
|
||||
"""Servo-specific interface."""
|
||||
|
||||
product = "servo"
|
||||
requirements = "requirements_servo.txt"
|
||||
|
@ -457,10 +448,7 @@ class Servo(Browser):
|
|||
|
||||
|
||||
class Sauce(Browser):
|
||||
"""Sauce-specific interface.
|
||||
|
||||
Includes installation, webdriver installation, and wptrunner setup methods.
|
||||
"""
|
||||
"""Sauce-specific interface."""
|
||||
|
||||
product = "sauce"
|
||||
requirements = "requirements_sauce.txt"
|
||||
|
|
|
@ -1 +1 @@
|
|||
requests==2.14.2
|
||||
requests==2.18.4
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
mozprocess == 0.26
|
||||
selenium == 3.9.0
|
||||
requests
|
||||
requests==2.18.4
|
||||
|
|
|
@ -8,17 +8,50 @@
|
|||
|
||||
// The following helper functions are called from RTCPeerConnection-helper.js:
|
||||
// getTrackFromUserMedia
|
||||
// doSignalingHandshake
|
||||
|
||||
// Create a RTCDTMFSender using getUserMedia()
|
||||
// Connect the PeerConnection to another PC and wait until it is
|
||||
// properly connected, so that DTMF can be sent.
|
||||
function createDtmfSender(pc = new RTCPeerConnection()) {
|
||||
var dtmfSender;
|
||||
return getTrackFromUserMedia('audio')
|
||||
.then(([track, mediaStream]) => {
|
||||
const sender = pc.addTrack(track, mediaStream);
|
||||
const dtmfSender = sender.dtmf;
|
||||
|
||||
dtmfSender = sender.dtmf;
|
||||
assert_true(dtmfSender instanceof RTCDTMFSender,
|
||||
'Expect audio sender.dtmf to be set to a RTCDTMFSender');
|
||||
|
||||
'Expect audio sender.dtmf to be set to a RTCDTMFSender');
|
||||
// Note: spec bug open - https://github.com/w3c/webrtc-pc/issues/1774
|
||||
// on whether sending should be possible before negotiation.
|
||||
const pc2 = new RTCPeerConnection();
|
||||
Object.defineProperty(pc, 'otherPc', { value: pc2 });
|
||||
exchangeIceCandidates(pc, pc2);
|
||||
return doSignalingHandshake(pc, pc2);
|
||||
}).then(() => {
|
||||
// Wait until dtmfSender.canInsertDTMF becomes true.
|
||||
// Up to 150 ms has been observed in test. Wait 1 second
|
||||
// in steps of 10 ms.
|
||||
// Note: Using a short timeout and rejected promise in order to
|
||||
// make test return a clear error message on failure.
|
||||
return new Promise((resolve, reject) => {
|
||||
let counter = 0;
|
||||
let checkfunc = function() {
|
||||
if (dtmfSender.canInsertDTMF) {
|
||||
resolve();
|
||||
} else {
|
||||
if (counter >= 100) {
|
||||
reject('Waited too long for canInsertDTMF');
|
||||
return;
|
||||
}
|
||||
++counter;
|
||||
step_timeout(checkfunc, 10);
|
||||
}
|
||||
};
|
||||
checkfunc();
|
||||
});
|
||||
}).then(() => {
|
||||
assert_true(dtmfSender.canInsertDTMF,
|
||||
'Failed to create usable dtmfSender:');
|
||||
return dtmfSender;
|
||||
});
|
||||
}
|
||||
|
@ -89,12 +122,12 @@ function test_tone_change_events(testFunc, toneChanges, desc) {
|
|||
t.step_func(() => {
|
||||
t.done();
|
||||
pc.close();
|
||||
pc.otherPc.close();
|
||||
}), expectedDuration + 100);
|
||||
}
|
||||
});
|
||||
|
||||
dtmfSender.addEventListener('tonechange', onToneChange);
|
||||
|
||||
testFunc(t, dtmfSender, pc);
|
||||
})
|
||||
.catch(t.step_func(err => {
|
||||
|
|
|
@ -55,7 +55,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
return createDtmfSender()
|
||||
.then(dtmfSender => {
|
||||
.then(dtmfSender => {
|
||||
dtmfSender.insertDTMF('');
|
||||
dtmfSender.insertDTMF('012345689');
|
||||
dtmfSender.insertDTMF('ABCD');
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
7. Fire an event named tonechange with a string consisting of tone at the
|
||||
RTCDTMFSender object.
|
||||
*/
|
||||
test_tone_change_events(dtmfSender => {
|
||||
test_tone_change_events((t, dtmfSender) => {
|
||||
dtmfSender.insertDTMF('123');
|
||||
}, [
|
||||
['1', '23', 0],
|
||||
|
@ -59,7 +59,7 @@
|
|||
['', '', 170]
|
||||
], 'insertDTMF() with default duration and intertoneGap should fire tonechange events at the expected time');
|
||||
|
||||
test_tone_change_events(dtmfSender => {
|
||||
test_tone_change_events((t, dtmfSender) => {
|
||||
dtmfSender.insertDTMF('abc', 100, 70);
|
||||
}, [
|
||||
['A', 'BC', 0],
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<!DOCTYPE html>
|
||||
<title>data URL shared worker</title>
|
||||
<title>data URL shared workers</title>
|
||||
<script src="/common/get-host-info.sub.js"></script>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
@ -15,8 +15,8 @@ function assert_worker_sends_pass(test_desc, mime_type, worker_code) {
|
|||
}, test_desc);
|
||||
}
|
||||
|
||||
function assert_worker_throws(test_desc, worker_code, before_connect_worker_code) {
|
||||
assert_worker_sends_pass(test_desc, '', `try { ${worker_code}; port.postMessage("FAIL"); } catch (e) { port.postMessage("PASS"); }`, before_connect_worker_code);
|
||||
function assert_worker_throws(test_desc, worker_code) {
|
||||
assert_worker_sends_pass(test_desc, '', `try { ${worker_code}; port.postMessage("FAIL"); } catch (e) { port.postMessage("PASS"); }`);
|
||||
}
|
||||
|
||||
// Any MIME type allowed
|
||||
|
@ -28,12 +28,17 @@ assert_worker_sends_pass('empty MIME allowed', '', 'port.postMessage("PASS")');
|
|||
assert_worker_sends_pass('communication goes both ways', 'application/javascript', 'port.onmessage = function(e) { port.postMessage("PASS"); }');
|
||||
|
||||
// test access to storage APIs
|
||||
// once https://github.com/w3c/IndexedDB/pull/150 lands, this is spec conforming
|
||||
assert_worker_throws('indexedDB inaccessible', 'self.indexedDB.open("someDBName")');
|
||||
assert_worker_throws('Web SQL Database inaccessible', 'self.openDatabase("someDBName", "1.0", "someDBName", 1);');
|
||||
|
||||
// https://w3c.github.io/IndexedDB/#dom-idbfactory-open
|
||||
assert_worker_sends_pass('indexedDB is present', '', 'port.postMessage("indexedDB" in self ? "PASS" : "FAIL")');
|
||||
assert_worker_throws('indexedDB is inaccessible', 'self.indexedDB.open("someDBName")');
|
||||
// Other standardized storage APIs are either not exposed to workers
|
||||
// (e.g. window.localStorage, window.sessionStorage), or are [SecureContext]
|
||||
// (e.g. self.caches).
|
||||
|
||||
// 'data:' workers are cross-origin
|
||||
assert_worker_sends_pass('cross-origin worker', '', 'fetch("/").then(() => port.postMessage("FAIL"), () => port.postMessage("PASS"))');
|
||||
|
||||
// 'data:' workers have opaque origin
|
||||
assert_worker_sends_pass('worker has opaque origin', 'application/javascript', 'if (self.location.origin == "null") port.postMessage("PASS"); else { port.postMessage("FAIL"); }');
|
||||
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Test workers can be started with a data URL</title>
|
||||
<title>data URL dedicated workers</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<div id="log"></div>
|
||||
<script>
|
||||
// Helper assert functions -START-
|
||||
function assert_worker_sends_pass(test_desc, mime_type, worker_code) {
|
||||
|
@ -36,7 +35,7 @@ function assert_worker_construction_fails(test_desc, mime_type, worker_code) {
|
|||
|
||||
// Actual tests -START-
|
||||
|
||||
// Any MIME type
|
||||
// Any MIME type allowed
|
||||
assert_worker_sends_pass('application/javascript MIME allowed', 'application/javascript', 'self.postMessage("PASS")');
|
||||
assert_worker_sends_pass('text/plain MIME allowed', 'text/plain', 'self.postMessage("PASS")');
|
||||
assert_worker_sends_pass('empty MIME allowed', '', 'self.postMessage("PASS")');
|
||||
|
@ -45,9 +44,14 @@ assert_worker_sends_pass('empty MIME allowed', '', 'self.postMessage("PASS")');
|
|||
assert_worker_sends_pass('communication goes both ways', 'application/javascript', 'onmessage = function(e) { self.postMessage("PASS"); }');
|
||||
|
||||
// test access to storage APIs
|
||||
// once https://github.com/w3c/IndexedDB/pull/150 lands, this is spec conforming
|
||||
assert_worker_throws('indexedDB inaccessible', 'self.indexedDB.open("someDBName")');
|
||||
assert_worker_throws('Web SQL Database inaccessible', 'self.openDatabase("someDBName", "1.0", "someDBName", 1);');
|
||||
|
||||
// https://w3c.github.io/IndexedDB/#dom-idbfactory-open
|
||||
assert_worker_sends_pass('indexedDB is present', '', 'self.postMessage("indexedDB" in self ? "PASS" : "FAIL")');
|
||||
assert_worker_throws('indexedDB is inaccessible', 'self.indexedDB.open("someDBName")');
|
||||
|
||||
// Other standardized storage APIs are either not exposed to workers
|
||||
// (e.g. window.localStorage, window.sessionStorage), or are [SecureContext]
|
||||
// (e.g. self.caches).
|
||||
|
||||
// 'data:' workers are cross-origin
|
||||
assert_worker_sends_pass('cross-origin worker', '', 'fetch("/").then(() => self.postMessage("FAIL"), () => self.postMessage("PASS"))');
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue