Auto merge of #20469 - servo-wpt-sync:wpt_update_28-03-2018, r=jdm

Sync WPT with upstream (28-03-2018)

Automated downstream sync of changes from upstream as of 28-03-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/20469)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2018-03-28 23:12:04 -04:00 committed by GitHub
commit a69eceefc9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
65 changed files with 1906 additions and 106 deletions

View file

@ -117737,6 +117737,162 @@
{}
]
],
"css/css-layout-api/constraints-fixed-inline-size-absolute-left-right.https.html": [
[
"/css/css-layout-api/constraints-fixed-inline-size-absolute-left-right.https.html",
[
[
"/css/css-layout-api/constraints-fixed-inline-size-ref.html",
"=="
]
],
{}
]
],
"css/css-layout-api/constraints-fixed-inline-size-absolute-top-bottom-vrl.https.html": [
[
"/css/css-layout-api/constraints-fixed-inline-size-absolute-top-bottom-vrl.https.html",
[
[
"/css/css-layout-api/constraints-fixed-inline-size-ref.html",
"=="
]
],
{}
]
],
"css/css-layout-api/constraints-fixed-inline-size-block-auto-avoid-floats-vlr.https.html": [
[
"/css/css-layout-api/constraints-fixed-inline-size-block-auto-avoid-floats-vlr.https.html",
[
[
"/css/css-layout-api/constraints-fixed-inline-size-ref.html",
"=="
]
],
{}
]
],
"css/css-layout-api/constraints-fixed-inline-size-block-auto-avoid-floats.https.html": [
[
"/css/css-layout-api/constraints-fixed-inline-size-block-auto-avoid-floats.https.html",
[
[
"/css/css-layout-api/constraints-fixed-inline-size-ref.html",
"=="
]
],
{}
]
],
"css/css-layout-api/constraints-fixed-inline-size-block-auto-vlr.https.html": [
[
"/css/css-layout-api/constraints-fixed-inline-size-block-auto-vlr.https.html",
[
[
"/css/css-layout-api/constraints-fixed-inline-size-ref.html",
"=="
]
],
{}
]
],
"css/css-layout-api/constraints-fixed-inline-size-block-auto.https.html": [
[
"/css/css-layout-api/constraints-fixed-inline-size-block-auto.https.html",
[
[
"/css/css-layout-api/constraints-fixed-inline-size-ref.html",
"=="
]
],
{}
]
],
"css/css-layout-api/constraints-fixed-inline-size-fixed-vrl.https.html": [
[
"/css/css-layout-api/constraints-fixed-inline-size-fixed-vrl.https.html",
[
[
"/css/css-layout-api/constraints-fixed-inline-size-ref.html",
"=="
]
],
{}
]
],
"css/css-layout-api/constraints-fixed-inline-size-fixed.https.html": [
[
"/css/css-layout-api/constraints-fixed-inline-size-fixed.https.html",
[
[
"/css/css-layout-api/constraints-fixed-inline-size-ref.html",
"=="
]
],
{}
]
],
"css/css-layout-api/constraints-fixed-inline-size-flex-grow-column-vrl.https.html": [
[
"/css/css-layout-api/constraints-fixed-inline-size-flex-grow-column-vrl.https.html",
[
[
"/css/css-layout-api/constraints-fixed-inline-size-ref.html",
"=="
]
],
{}
]
],
"css/css-layout-api/constraints-fixed-inline-size-flex-grow.https.html": [
[
"/css/css-layout-api/constraints-fixed-inline-size-flex-grow.https.html",
[
[
"/css/css-layout-api/constraints-fixed-inline-size-ref.html",
"=="
]
],
{}
]
],
"css/css-layout-api/constraints-fixed-inline-size-grid.https.html": [
[
"/css/css-layout-api/constraints-fixed-inline-size-grid.https.html",
[
[
"/css/css-layout-api/constraints-fixed-inline-size-ref.html",
"=="
]
],
{}
]
],
"css/css-layout-api/constraints-fixed-inline-size-percentage-vlr.https.html": [
[
"/css/css-layout-api/constraints-fixed-inline-size-percentage-vlr.https.html",
[
[
"/css/css-layout-api/constraints-fixed-inline-size-ref.html",
"=="
]
],
{}
]
],
"css/css-layout-api/constraints-fixed-inline-size-percentage.https.html": [
[
"/css/css-layout-api/constraints-fixed-inline-size-percentage.https.html",
[
[
"/css/css-layout-api/constraints-fixed-inline-size-ref.html",
"=="
]
],
{}
]
],
"css/css-layout-api/fallback-constructor-error.https.html": [
[
"/css/css-layout-api/fallback-constructor-error.https.html",
@ -181317,6 +181473,30 @@
{}
]
],
"shadow-dom/layout-slot-no-longer-assigned.html": [
[
"/shadow-dom/layout-slot-no-longer-assigned.html",
[
[
"/shadow-dom/reference/empty.html",
"=="
]
],
{}
]
],
"shadow-dom/layout-slot-no-longer-fallback.html": [
[
"/shadow-dom/layout-slot-no-longer-fallback.html",
[
[
"/shadow-dom/reference/empty.html",
"=="
]
],
{}
]
],
"shadow-dom/untriaged/shadow-trees/nested-shadow-trees/nested_tree_reftest.html": [
[
"/shadow-dom/untriaged/shadow-trees/nested-shadow-trees/nested_tree_reftest.html",
@ -248328,6 +248508,11 @@
{}
]
],
"css/css-layout-api/constraints-fixed-inline-size-ref.html": [
[
{}
]
],
"css/css-layout-api/fallback-ref.html": [
[
{}
@ -248353,6 +248538,11 @@
{}
]
],
"css/css-layout-api/support/constraints-fixed-inline-size.js": [
[
{}
]
],
"css/css-layout-api/support/layout-child-fixed-sizes-worklet.js": [
[
{}
@ -281293,6 +281483,11 @@
{}
]
],
"html/semantics/document-metadata/the-link-element/resources/link-load-error-events.sub.js": [
[
{}
]
],
"html/semantics/document-metadata/the-link-element/resources/stylesheet.css": [
[
{}
@ -293143,6 +293338,11 @@
{}
]
],
"shadow-dom/reference/empty.html": [
[
{}
]
],
"shadow-dom/resources/Document-prototype-currentScript-helper.js": [
[
{}
@ -317557,6 +317757,12 @@
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/center-coordinate.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/center-coordinate.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/clear.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/clear.html",
@ -317587,6 +317793,12 @@
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/coordinate.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/coordinate.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/direction.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/direction.html",
@ -317965,12 +318177,42 @@
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/text-decoration-line.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/text-decoration-line.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/text-decoration-skip-ink.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/text-decoration-skip-ink.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/text-decoration-skip.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/text-decoration-skip.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-decoration-width.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/text-decoration-width.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/text-decoration.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/text-decoration.html",
{}
]
],
"css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color.html": [
[
"/css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color.html",
@ -320839,6 +321081,12 @@
{}
]
],
"dom/events/relatedTarget.window.js": [
[
"/dom/events/relatedTarget.window.html",
{}
]
],
"dom/historical.html": [
[
"/dom/historical.html",
@ -330139,6 +330387,18 @@
{}
]
],
"html/semantics/document-metadata/the-link-element/link-load-error-events.html": [
[
"/html/semantics/document-metadata/the-link-element/link-load-error-events.html",
{}
]
],
"html/semantics/document-metadata/the-link-element/link-load-error-events.https.html": [
[
"/html/semantics/document-metadata/the-link-element/link-load-error-events.https.html",
{}
]
],
"html/semantics/document-metadata/the-link-element/link-load-event.html": [
[
"/html/semantics/document-metadata/the-link-element/link-load-event.html",
@ -338217,6 +338477,12 @@
{}
]
],
"html/webappapis/scripting/events/event-handler-attributes-window-body.html": [
[
"/html/webappapis/scripting/events/event-handler-attributes-window-body.html",
{}
]
],
"html/webappapis/scripting/events/event-handler-javascript.html": [
[
"/html/webappapis/scripting/events/event-handler-javascript.html",
@ -502710,6 +502976,62 @@
"a999a2a7ad8981879cdc984bf602939a23a60ea6",
"testharness"
],
"css/css-layout-api/constraints-fixed-inline-size-absolute-left-right.https.html": [
"15f8dde88dd066b5525a6b8990206ac567f48b2a",
"reftest"
],
"css/css-layout-api/constraints-fixed-inline-size-absolute-top-bottom-vrl.https.html": [
"9cb3a2b8671ef4f9926a39431d193875a5a1738a",
"reftest"
],
"css/css-layout-api/constraints-fixed-inline-size-block-auto-avoid-floats-vlr.https.html": [
"b38fb83238cba9bef74121b1f2a07a1667e4ea63",
"reftest"
],
"css/css-layout-api/constraints-fixed-inline-size-block-auto-avoid-floats.https.html": [
"50b56739750402d286da5a3c6cdbbc0335a60bd4",
"reftest"
],
"css/css-layout-api/constraints-fixed-inline-size-block-auto-vlr.https.html": [
"929bc22562cd2b1a3635b082c4176215d8668857",
"reftest"
],
"css/css-layout-api/constraints-fixed-inline-size-block-auto.https.html": [
"8d0459a147ed62a8c2dc6941bfb38335fa9ad4e5",
"reftest"
],
"css/css-layout-api/constraints-fixed-inline-size-fixed-vrl.https.html": [
"888a34c8a1e40c7687a5500efce2496bb5e1b2b6",
"reftest"
],
"css/css-layout-api/constraints-fixed-inline-size-fixed.https.html": [
"d98fc7d2cdecc5f11a6853a3280aaf106a8de4e2",
"reftest"
],
"css/css-layout-api/constraints-fixed-inline-size-flex-grow-column-vrl.https.html": [
"924c0581767d514b24b530ab012233d61d96055a",
"reftest"
],
"css/css-layout-api/constraints-fixed-inline-size-flex-grow.https.html": [
"3f0077ceb95fcfa870c6c6625efbee3c8fa1e2b6",
"reftest"
],
"css/css-layout-api/constraints-fixed-inline-size-grid.https.html": [
"ec0ea758406f3bbc73d5d8b8ee2138a3fd941163",
"reftest"
],
"css/css-layout-api/constraints-fixed-inline-size-percentage-vlr.https.html": [
"e1e299e101a6f501f2a27b867db36ab8afdc73d1",
"reftest"
],
"css/css-layout-api/constraints-fixed-inline-size-percentage.https.html": [
"c11a34aeba8f8743723b8859bb9c6fca886cda23",
"reftest"
],
"css/css-layout-api/constraints-fixed-inline-size-ref.html": [
"1d7de325448b3132ec04b8788665829ff5d1fb02",
"support"
],
"css/css-layout-api/fallback-constructor-error.https.html": [
"fdb9954e12f4628c114499a5e69f257b60377617",
"reftest"
@ -502834,6 +503156,10 @@
"361b3c82c37c0068d23ae23e96d8e9185d3765b0",
"reftest"
],
"css/css-layout-api/support/constraints-fixed-inline-size.js": [
"ed0224a380c50a7e83d23a95be5a4348ce5bf706",
"support"
],
"css/css-layout-api/support/layout-child-fixed-sizes-worklet.js": [
"5ddda72e3c9d077508622511e8685249c7803028",
"support"
@ -523063,7 +523389,7 @@
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/animation-direction.html": [
"05e0be2c67fd695d693f2a639acf88ff78d8fd04",
"6c988281b4773fa25ef0d811ff6e0cd37a1e0fae",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/backface-visibility.html": [
@ -523075,7 +523401,7 @@
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/background-image.html": [
"1255fea8e74561e14720ccf422fd841e1d3e32fa",
"08055b88eca1f841f3b8a9867d8ffeb93d214d1f",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/background.html": [
@ -523126,6 +523452,10 @@
"d4139aeff755abe89ee1e04fcd34ccfba4efe91c",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/center-coordinate.html": [
"3f7e38c8f71e7da0fb17e714f37821922bd3d720",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/clear.html": [
"376585635ab5752db4b2078f6247fa621a954282",
"testharness"
@ -523146,6 +523476,10 @@
"3f6faf5b2371d8be9483148f3bfa562710c9c3ef",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/coordinate.html": [
"f03d1956798b3bbf5d4ed421cea55b274b7fecc7",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/direction.html": [
"b7c49aba4e8785f819beeb444c113d937d441089",
"testharness"
@ -523291,7 +523625,7 @@
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/mask-image.html": [
"2a20c6818e9d71adbf3902fde74cb26136917e72",
"8400ca1a6caf399c5914df06028d6616fb9f9571",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/mix-blend-mode.html": [
@ -523371,7 +523705,7 @@
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/resources/testsuite.js": [
"7e6c530cf36cce5d7b8d02abbbefbdd4370d1be1",
"ca6f58ecbab01ee294f4388b456b3b1bdd7a4629",
"support"
],
"css/css-typed-om/the-stylepropertymap/properties/right.html": [
@ -523402,10 +523736,30 @@
"fe6d3765ca8fea1c1963a310d0aa35fa68089a9b",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/text-decoration-line.html": [
"0bd9668c45b14a0c52869ed0627cc408af550a25",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/text-decoration-skip-ink.html": [
"f6a122cc2d44432e94e0700961868a5708cde232",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/text-decoration-skip.html": [
"db1e8a3d65c8c0653e3412c965df11fc4917ba85",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/text-decoration-style.html": [
"b541bd8b57f8b85f6e5f3a17a3266169debee876",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/text-decoration-width.html": [
"50f917bbd7df4e0c235a6c84a4ec5a90243e36dc",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/text-decoration.html": [
"88d9f53aa4691c682c37fe74f7644e8ac8344cc9",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/text-emphasis-color.html": [
"9419ab219034d1fb732965ebd3a03934bcaddf5a",
"testharness"
@ -523431,7 +523785,7 @@
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/transition-duration.html": [
"b735f3ff6dba561cf2e35a8a85a8e2b93c0edc61",
"fe613a427b8c057fb859eb70a58d506c6a0b3cde",
"testharness"
],
"css/css-typed-om/the-stylepropertymap/properties/unicode-bidi.html": [
@ -546258,6 +546612,10 @@
"40ab5636653dfd105738ab38e7d22316132eb630",
"testharness"
],
"dom/events/relatedTarget.window.js": [
"0426d2ecae3f3562be175e4364353d979365ed1c",
"testharness"
],
"dom/historical.html": [
"ccf3d9d2d8eb3e7353ecedd8a4d8ba232f9374ec",
"testharness"
@ -563546,8 +563904,16 @@
"1ffdecee25d1f3819f3f67241c3f0746bedbcf97",
"testharness"
],
"html/semantics/document-metadata/the-link-element/link-load-error-events.html": [
"8835935f157e5c227a8ce62f1a4fafcb46c50914",
"testharness"
],
"html/semantics/document-metadata/the-link-element/link-load-error-events.https.html": [
"8835935f157e5c227a8ce62f1a4fafcb46c50914",
"testharness"
],
"html/semantics/document-metadata/the-link-element/link-load-event.html": [
"a1a8b7b20492b7fef977f7734425f9cf55322f2a",
"628527090c78d90d831cb80ea8eee7ffa66722f5",
"testharness"
],
"html/semantics/document-metadata/the-link-element/link-rellist.html": [
@ -563570,6 +563936,10 @@
"04a3a89fe805fc930dc3adfa3a4134b950779697",
"support"
],
"html/semantics/document-metadata/the-link-element/resources/link-load-error-events.sub.js": [
"0c45045a1db6958751dfe112aa3234ca936263e7",
"support"
],
"html/semantics/document-metadata/the-link-element/resources/stylesheet.css": [
"2829167c82bafef6cfea06071007a231aa4277f6",
"support"
@ -571846,6 +572216,10 @@
"c25750e626c5c2121833fd4627f656ffe9c83d38",
"testharness"
],
"html/webappapis/scripting/events/event-handler-attributes-window-body.html": [
"d5a47edd139eb2ff2fe035451f44996bfe2f414d",
"testharness"
],
"html/webappapis/scripting/events/event-handler-javascript.html": [
"2dece90b5e8b3ac3371a732e158ff44b8ea63b00",
"testharness"
@ -576139,7 +576513,7 @@
"testharness"
],
"navigation-timing/test_timing_server_redirect.html": [
"10b7f221c4667e92a993f0aae70820a95ea445aa",
"e08cd61d0e373b0ba04e00d429b3c607df8d2fd4",
"testharness"
],
"navigation-timing/test_timing_xserver_redirect.html": [
@ -582583,7 +582957,7 @@
"support"
],
"payment-request/OWNERS": [
"448f2bd0db2f9cff5bbe5c2b9e80c8d609d5379f",
"60cf95eb7b2e583315fe8539d2caf38667412d19",
"support"
],
"payment-request/PaymentAddress/attributes-and-toJSON-method-manual.https.html": [
@ -582811,11 +583185,11 @@
"manual"
],
"payment-request/show-method-optional-promise-rejects-manual.https.html": [
"62542519059ab38ee0753deff5e7e6e587f8adbf",
"a8dde7fa5b501688a51f23b330e4cd25273a6146",
"manual"
],
"payment-request/show-method-optional-promise-resolves-manual.https.html": [
"a07f98e117bce1f040c5e62ef3acbd2ef7475338",
"a19166fd1366f8510bec53b4e9fc1033a129c44b",
"manual"
],
"payment-request/show-method-postmessage-iframe.html": [
@ -593231,7 +593605,7 @@
"testharness"
],
"service-workers/service-worker/fetch-event.https.html": [
"9d365e1960c873a48cf5378cda7615cbef49f5cd",
"1a7e0410ef0e486738ca7c76542c2612228d5bd2",
"testharness"
],
"service-workers/service-worker/fetch-frame-resource.https.html": [
@ -595090,6 +595464,14 @@
"1469992db34a25397dc3d5a5e1eb600e8afcf71b",
"testharness"
],
"shadow-dom/layout-slot-no-longer-assigned.html": [
"224a688177941774e0bd3be74cb4aef20160d903",
"reftest"
],
"shadow-dom/layout-slot-no-longer-fallback.html": [
"a9be2ec9174a8944a237462b51519a8f88b4987a",
"reftest"
],
"shadow-dom/leaktests/get-elements.html": [
"ceffb5ff2e8b171975acb616d83079f0cfa7a82a",
"testharness"
@ -595102,6 +595484,10 @@
"2e7c236bb756dfbd3a6c42c547fc7d7e897883ce",
"testharness"
],
"shadow-dom/reference/empty.html": [
"51a23151c28992fe062b36914463de216bd55fbe",
"support"
],
"shadow-dom/resources/Document-prototype-currentScript-helper.js": [
"f7d4af7942bcd858df4a2f1a8bbda86b32baee31",
"support"
@ -602727,7 +603113,7 @@
"wdspec"
],
"webdriver/tests/contexts/maximize_window.py": [
"7912e2f7ebdffe2598eb3b9a20f4fc7fce22447e",
"e0dfeb6234371077baa7f67a45d7ffa9b61c9759",
"wdspec"
],
"webdriver/tests/contexts/resizing_and_positioning.py": [
@ -602771,19 +603157,19 @@
"support"
],
"webdriver/tests/element_retrieval/find_element.py": [
"699b97bd31eed625e2f0bed145aaf94c3e646853",
"8c9ed3ac2169f4b65a2e172a6e77b9586d83afa2",
"wdspec"
],
"webdriver/tests/element_retrieval/find_element_from_element.py": [
"fa64a4164762861097f11252e8526261038ae1c5",
"4ac7c4f27f19fe0b6a42fe888b478b78d9c4ca7e",
"wdspec"
],
"webdriver/tests/element_retrieval/find_elements.py": [
"284ae53c5c94d02fb46b26dcd70af02d7917e7b4",
"fa8c2de1ffd12432bf14368b9c72000567ab8d20",
"wdspec"
],
"webdriver/tests/element_retrieval/find_elements_from_element.py": [
"90be4b09a41b8ba00529a78983fbd64cdb3453ef",
"0afca7c9c332ac6bc4da4dd9607ae36b42914a14",
"wdspec"
],
"webdriver/tests/element_retrieval/get_active_element.py": [
@ -602827,7 +603213,7 @@
"wdspec"
],
"webdriver/tests/fullscreen_window.py": [
"67cc7d992d81a176297038f5516c8a9c95018040",
"c244064c0595d9274ddef98c527d193355ba13fa",
"wdspec"
],
"webdriver/tests/get_window_rect.py": [
@ -602847,7 +603233,7 @@
"testharness"
],
"webdriver/tests/minimize_window.py": [
"ac1df5462702ac368ffa92cc12cfb5e34df226ac",
"08d4414ce915f1ebe7825d5d99e204dc331fe155",
"wdspec"
],
"webdriver/tests/navigation/current_url.py": [
@ -602903,7 +603289,7 @@
"wdspec"
],
"webdriver/tests/set_window_rect.py": [
"8a124f80e6e7732a651a80da3f6cdf8e2ed99e3e",
"079038aa66cb729cf205aac040a5fe075d01fd8a",
"wdspec"
],
"webdriver/tests/state/__init__.py": [
@ -603679,7 +604065,7 @@
"testharness"
],
"webrtc/RTCPeerConnection-track-stats.https.html": [
"92fbaf0f4c596222975edae433725d616dac6082",
"f69d223cb8cd11e4b68b7687e2361ed3ea947f5e",
"testharness"
],
"webrtc/RTCPeerConnectionIceEvent-constructor.html": [
@ -603743,7 +604129,7 @@
"testharness"
],
"webrtc/RTCRtpSender-getStats.https.html": [
"5c480c0d64de4e3ee041b95e5ccaec6264b878b8",
"64c4424e36c566294a317fb423eb02e97a9ebbca",
"testharness"
],
"webrtc/RTCRtpSender-replaceTrack.html": [

View file

@ -0,0 +1,2 @@
[vh_not_refreshing_on_chrome.html]
expected: FAIL

View file

@ -0,0 +1,4 @@
[relatedTarget.window.html]
[Untitled]
expected: FAIL

View file

@ -0,0 +1,10 @@
[link-load-error-events.html]
[Load of non-CSS stylesheet]
expected: FAIL
[Import of non-CSS stylesheet]
expected: FAIL
[Import of import of non-CSS stylesheet]
expected: FAIL

View file

@ -0,0 +1,19 @@
[link-load-error-events.https.html]
[Load of non-CSS stylesheet]
expected: FAIL
[Import of non-CSS stylesheet]
expected: FAIL
[Import of import of non-CSS stylesheet]
expected: FAIL
[Load of http:// stylesheet]
expected: FAIL
[Import of http:// stylesheet]
expected: FAIL
[Import of import of http:// stylesheet]
expected: FAIL

View file

@ -0,0 +1,4 @@
[event-handler-attributes-window-body.html]
[error]
expected: FAIL

View file

@ -1,5 +0,0 @@
[rapid-resizing.html]
expected: TIMEOUT
[Overall test]
expected: NOTRUN

View file

@ -1,5 +0,0 @@
[shader-with-non-reserved-words.html]
expected: TIMEOUT
[Overall test]
expected: NOTRUN

View file

@ -0,0 +1,33 @@
<!DOCTYPE html>
<html class=reftest-wait>
<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutconstraints-fixedinlinesize">
<link rel="match" href="constraints-fixed-inline-size-ref.html">
<meta name="assert" content="This test checks that LayoutConstraints#fixedInlineSize is passed into the layout function correctly." />
<style>
body {
position: relative;
width: 120px;
}
.test {
background: red;
position: absolute;
left: 0px;
right: 20px;
}
@supports (display: layout(test)) {
.test {
background: green;
display: layout(test);
}
}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
<div class="test"></div>
<script>
importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/constraints-fixed-inline-size.js'});
</script>

View file

@ -0,0 +1,35 @@
<!DOCTYPE html>
<html class=reftest-wait>
<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutconstraints-fixedinlinesize">
<link rel="match" href="constraints-fixed-inline-size-ref.html">
<meta name="assert" content="This test checks that LayoutConstraints#fixedInlineSize is passed into the layout function correctly." />
<style>
body {
position: relative;
height: 120px;
}
.test {
background: red;
position: absolute;
left: 0px;
top: 0px;
bottom: 20px;
writing-mode: vertical-rl;
}
@supports (display: layout(test)) {
.test {
background: green;
display: layout(test);
}
}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
<div class="test"></div>
<script>
importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/constraints-fixed-inline-size.js'});
</script>

View file

@ -0,0 +1,37 @@
<!DOCTYPE html>
<html class=reftest-wait>
<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutconstraints-fixedinlinesize">
<link rel="match" href="constraints-fixed-inline-size-ref.html">
<meta name="assert" content="This test checks that LayoutConstraints#fixedInlineSize is passed into the layout function correctly." />
<style>
body {
height: 200px;
writing-mode: vertical-lr;
}
.float {
float: right;
width: 20px;
height: 100px;
}
.test {
background: red;
}
@supports (display: layout(test)) {
.test {
background: green;
display: layout(test);
}
}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
<div class="float"></div>
<div class="test"></div>
<script>
importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/constraints-fixed-inline-size.js'});
</script>

View file

@ -0,0 +1,36 @@
<!DOCTYPE html>
<html class=reftest-wait>
<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutconstraints-fixedinlinesize">
<link rel="match" href="constraints-fixed-inline-size-ref.html">
<meta name="assert" content="This test checks that LayoutConstraints#fixedInlineSize is passed into the layout function correctly." />
<style>
body {
width: 200px;
}
.float {
float: right;
width: 100px;
height: 20px;
}
.test {
background: red;
}
@supports (display: layout(test)) {
.test {
background: green;
display: layout(test);
}
}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
<div class="float"></div>
<div class="test"></div>
<script>
importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/constraints-fixed-inline-size.js'});
</script>

View file

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html class=reftest-wait>
<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutconstraints-fixedinlinesize">
<link rel="match" href="constraints-fixed-inline-size-ref.html">
<meta name="assert" content="This test checks that LayoutConstraints#fixedInlineSize is passed into the layout function correctly." />
<style>
body {
height: 120px;
writing-mode: vertical-lr;
}
.test {
margin-bottom: 20px;
background: red;
}
@supports (display: layout(test)) {
.test {
background: green;
display: layout(test);
}
}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
<div class="test"></div>
<script>
importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/constraints-fixed-inline-size.js'});
</script>

View file

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html class=reftest-wait>
<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutconstraints-fixedinlinesize">
<link rel="match" href="constraints-fixed-inline-size-ref.html">
<meta name="assert" content="This test checks that LayoutConstraints#fixedInlineSize is passed into the layout function correctly." />
<style>
body {
width: 120px;
}
.test {
margin-right: 20px;
background: red;
}
@supports (display: layout(test)) {
.test {
background: green;
display: layout(test);
}
}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
<div class="test"></div>
<script>
importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/constraints-fixed-inline-size.js'});
</script>

View file

@ -0,0 +1,27 @@
<!DOCTYPE html>
<html class=reftest-wait>
<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutconstraints-fixedinlinesize">
<link rel="match" href="constraints-fixed-inline-size-ref.html">
<meta name="assert" content="This test checks that LayoutConstraints#fixedInlineSize is passed into the layout function correctly." />
<style>
.test {
background: red;
height: 100px;
writing-mode: vertical-rl;
}
@supports (display: layout(test)) {
.test {
background: green;
display: layout(test);
}
}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
<div class="test"></div>
<script>
importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/constraints-fixed-inline-size.js'});
</script>

View file

@ -0,0 +1,26 @@
<!DOCTYPE html>
<html class=reftest-wait>
<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutconstraints-fixedinlinesize">
<link rel="match" href="constraints-fixed-inline-size-ref.html">
<meta name="assert" content="This test checks that LayoutConstraints#fixedInlineSize is passed into the layout function correctly." />
<style>
.test {
background: red;
width: 100px;
}
@supports (display: layout(test)) {
.test {
background: green;
display: layout(test);
}
}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
<div class="test"></div>
<script>
importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/constraints-fixed-inline-size.js'});
</script>

View file

@ -0,0 +1,33 @@
<!DOCTYPE html>
<html class=reftest-wait>
<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutconstraints-fixedinlinesize">
<link rel="match" href="constraints-fixed-inline-size-ref.html">
<meta name="assert" content="This test checks that LayoutConstraints#fixedInlineSize is passed into the layout function correctly." />
<style>
body {
display: flex;
flex-flow: column;
width: 100px;
height: 100px;
}
.test {
background: red;
flex-grow: 1;
}
@supports (display: layout(test)) {
.test {
background: green;
display: layout(test);
}
}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
<div class="test"></div>
<script>
importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/constraints-fixed-inline-size.js'});
</script>

View file

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html class=reftest-wait>
<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutconstraints-fixedinlinesize">
<link rel="match" href="constraints-fixed-inline-size-ref.html">
<meta name="assert" content="This test checks that LayoutConstraints#fixedInlineSize is passed into the layout function correctly." />
<style>
body {
display: flex;
width: 100px;
}
.test {
background: red;
flex-grow: 1;
}
@supports (display: layout(test)) {
.test {
background: green;
display: layout(test);
}
}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
<div class="test"></div>
<script>
importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/constraints-fixed-inline-size.js'});
</script>

View file

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html class=reftest-wait>
<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutconstraints-fixedinlinesize">
<link rel="match" href="constraints-fixed-inline-size-ref.html">
<meta name="assert" content="This test checks that LayoutConstraints#fixedInlineSize is passed into the layout function correctly." />
<style>
body {
display: grid;
grid: auto-flow / 100px;
}
.test {
background: red;
}
@supports (display: layout(test)) {
.test {
background: green;
display: layout(test);
}
}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
<div class="test"></div>
<script>
importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/constraints-fixed-inline-size.js'});
</script>

View file

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html class=reftest-wait>
<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutconstraints-fixedinlinesize">
<link rel="match" href="constraints-fixed-inline-size-ref.html">
<meta name="assert" content="This test checks that LayoutConstraints#fixedInlineSize is passed into the layout function correctly." />
<style>
body {
height: 200px;
writing-mode: vertical-lr;
}
.test {
background: red;
height: 50%;
}
@supports (display: layout(test)) {
.test {
background: green;
display: layout(test);
}
}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
<div class="test"></div>
<script>
importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/constraints-fixed-inline-size.js'});
</script>

View file

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html class=reftest-wait>
<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutconstraints-fixedinlinesize">
<link rel="match" href="constraints-fixed-inline-size-ref.html">
<meta name="assert" content="This test checks that LayoutConstraints#fixedInlineSize is passed into the layout function correctly." />
<style>
body {
width: 200px;
}
.test {
background: red;
width: 50%;
}
@supports (display: layout(test)) {
.test {
background: green;
display: layout(test);
}
}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/common/worklet-reftest.js"></script>
<div class="test"></div>
<script>
importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/constraints-fixed-inline-size.js'});
</script>

View file

@ -0,0 +1,10 @@
<!DOCTYPE html>
<style>
.result {
background: green;
height: 100px;
width: 100px;
}
</style>
<div class="result"></div>

View file

@ -0,0 +1,9 @@
registerLayout('test', class {
*intrinsicSizes() {}
*layout(children, edges, constraints, styleMap) {
if (constraints.fixedInlineSize !== 100)
return {autoBlockSize: 0};
return {autoBlockSize: 100};
}
});

View file

@ -13,8 +13,7 @@
<script>
'use strict';
// FIXME: animation-direction is list-valued. Run list-valued tests here too.
runPropertyTests('animation-direction', [
runListValuedPropertyTests('animation-direction', [
{ syntax: 'normal' },
{ syntax: 'reverse' },
{ syntax: 'alternate-reverse' },

View file

@ -13,8 +13,7 @@
<script>
'use strict';
// FIXME: background-image is list-valued. Run list-valued tests here too.
runPropertyTests('background-image', [
runListValuedPropertyTests('background-image', [
{ syntax: 'none' },
{ syntax: '<image>' },
]);

View file

@ -0,0 +1,26 @@
<!doctype html>
<meta charset="utf-8">
<title>'center-coordinate' 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('cx', [
{ syntax: '<percentage>' },
{ syntax: '<length>' },
]);
runPropertyTests('cy', [
{ syntax: '<percentage>' },
{ syntax: '<length>' },
]);
</script>

View file

@ -0,0 +1,26 @@
<!doctype html>
<meta charset="utf-8">
<title>'coordinate' 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('x', [
{ syntax: '<percentage>' },
{ syntax: '<length>' },
]);
runPropertyTests('y', [
{ syntax: '<percentage>' },
{ syntax: '<length>' },
]);
</script>

View file

@ -13,8 +13,7 @@
<script>
'use strict';
// FIXME: mask-image is list-valued. Run list-valued tests here too.
runPropertyTests('mask-image', [
runListValuedPropertyTests('mask-image', [
{ syntax: 'none' },
{ syntax: '<image>' },
]);

View file

@ -378,6 +378,12 @@ function runPropertyTests(propertyName, testCases) {
}
}
// Same as runPropertyTests but for list-valued properties.
function runListValuedPropertyTests(propertyName, testCases) {
// TODO(https://crbug.com/545318): Run list-valued tests as well.
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

View file

@ -0,0 +1,26 @@
<!doctype html>
<meta charset="utf-8">
<title>'text-decoration-line' 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-line', [
{ syntax: 'none' },
{ syntax: 'underline' },
{ syntax: 'overline' },
{ syntax: 'line-through' },
{ syntax: 'blink' },
{ syntax: 'spelling-error' },
{ syntax: 'grammar-error' },
]);
</script>

View file

@ -0,0 +1,21 @@
<!doctype html>
<meta charset="utf-8">
<title>'text-decoration-skip-ink' 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-skip-ink', [
{ syntax: 'auto' },
{ syntax: 'none' },
]);
</script>

View file

@ -0,0 +1,29 @@
<!doctype html>
<meta charset="utf-8">
<title>'text-decoration-skip' 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-skip', [
{ syntax: 'none' },
{ syntax: 'objects' },
{ syntax: 'edges' },
{ syntax: 'box-decoration' },
{ syntax: 'spaces' },
]);
runUnsupportedPropertyTests('text-decoration-skip', [
'objects spaces', 'leading-spaces trailing-spaces',
'objects edges box-decoration'
]);
</script>

View file

@ -0,0 +1,24 @@
<!doctype html>
<meta charset="utf-8">
<title>'text-decoration-width' 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-width', [
{ syntax: 'auto' },
{
syntax: '<length>',
specified: assert_is_equal_with_range_handling
},
]);
</script>

View file

@ -0,0 +1,20 @@
<!doctype html>
<meta charset="utf-8">
<title>'text-decoration' 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';
runUnsupportedPropertyTests('text-decoration', [
'underline', 'underline dotted #ff3028', 'green wavy underline'
]);
</script>

View file

@ -12,8 +12,7 @@
<script>
'use strict';
// FIXME: transition-duration is list-valued. Run list-valued tests here too.
runPropertyTests('transition-duration', [
runListValuedPropertyTests('transition-duration', [
{ syntax: '<time>' },
]);

View file

@ -0,0 +1,85 @@
// https://dom.spec.whatwg.org/#concept-event-dispatch
const host = document.createElement("div"),
child = host.appendChild(document.createElement("p")),
shadow = host.attachShadow({ mode: "closed" }),
slot = shadow.appendChild(document.createElement("slot"));
test(() => {
for (target of [shadow, slot]) {
for (relatedTarget of [new XMLHttpRequest(), self, host]) {
const event = new FocusEvent("demo", { relatedTarget: relatedTarget });
target.dispatchEvent(event);
assert_equals(event.target, null);
assert_equals(event.relatedTarget, null);
}
}
}, "Reset if target pointed to a shadow tree");
test(() => {
for (relatedTarget of [shadow, slot]) {
for (target of [new XMLHttpRequest(), self, host]) {
const event = new FocusEvent("demo", { relatedTarget: relatedTarget });
target.dispatchEvent(event);
assert_equals(event.target, null);
assert_equals(event.relatedTarget, null);
}
}
}, "Reset if relatedTarget pointed to a shadow tree");
async_test(t => {
const shadowChild = shadow.appendChild(document.createElement("div"));
shadowChild.addEventListener("demo", t.step_func(() => document.body.appendChild(shadowChild)));
const event = new FocusEvent("demo", { relatedTarget: new XMLHttpRequest() });
shadowChild.dispatchEvent(event);
assert_equals(shadowChild.parentNode, document.body);
assert_equals(event.target, null);
assert_equals(event.relatedTarget, null);
shadowChild.remove();
t.done();
}, "Reset if target pointed to a shadow tree pre-dispatch");
async_test(t => {
const shadowChild = shadow.appendChild(document.createElement("div"));
shadowChild.addEventListener("demo", t.step_func(() => document.body.appendChild(shadowChild)));
const event = new FocusEvent("demo", { relatedTarget: shadowChild });
document.body.dispatchEvent(event);
assert_equals(shadowChild.parentNode, document.body);
assert_equals(event.target, null);
assert_equals(event.relatedTarget, null);
shadowChild.remove();
t.done();
}, "Reset if relatedTarget pointed to a shadow tree pre-dispatch");
async_test(t => {
const event = new FocusEvent("heya", { relatedTarget: shadow, cancelable: true }),
callback = t.unreached_func();
host.addEventListener("heya", callback);
t.add_cleanup(() => host.removeEventListener("heya", callback));
event.preventDefault();
assert_true(event.defaultPrevented);
assert_false(host.dispatchEvent(event));
assert_equals(event.target, null);
assert_equals(event.relatedTarget, null);
// Check that the dispatch flag is cleared
event.initEvent("x");
assert_equals(event.type, "x");
t.done();
}, "Reset targets on early return");
async_test(t => {
const input = document.body.appendChild(document.createElement("input")),
event = new MouseEvent("click", { relatedTarget: shadow });
let seen = false;
t.add_cleanup(() => input.remove());
input.type = "checkbox";
input.oninput = t.step_func(() => {
assert_equals(event.target, null);
assert_equals(event.relatedTarget, null);
assert_equals(event.composedPath().length, 0);
seen = true;
});
assert_true(input.dispatchEvent(event));
assert_true(seen);
t.done();
}, "Reset targets before activation behavior");

View file

@ -0,0 +1,6 @@
<!doctype html>
<meta charset=utf-8>
<title></title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="resources/link-load-error-events.sub.js"></script>

View file

@ -0,0 +1,6 @@
<!doctype html>
<meta charset=utf-8>
<title></title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="resources/link-load-error-events.sub.js"></script>

View file

@ -3,16 +3,15 @@
<link rel="help" href="https://html.spec.whatwg.org/multipage/#the-link-element">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link href="style.css?pipe=trickle(d3)" rel="stylesheet" id="style_test"></link>
<script>
var saw_link_onload = false;
var t = async_test("Check if the stylesheet's load event blocks the document load event");
document.getElementById('style_test').onload = t.step_func(function() {
saw_link_onload = true;
});
window.addEventListener('load', t.step_func_done(function() {
assert_true(saw_link_onload);
}));
</script>
<link href="style.css?pipe=trickle(d3)" rel="stylesheet" id="style_test"
onload="t.step(function() { saw_link_onload = true; });"
onerror="t.step(function() { assert_unreached('Sheet should load OK'); });"></link>
</head>
</html>

View file

@ -0,0 +1,187 @@
/**
* This is the guts of the load/error event tests for <link rel="stylesheet">.
*
* We have a list of tests each of which is an object containing: href value,
* expected load success boolean, test description. Href values are set up in
* such a way that we guarantee that all stylesheet URLs are unique. This
* avoids issues around caching of sheets based on URL.
*/
var isHttps = location.protocol == "https:";
var tests = [
// Basic tests
{
href: existingSheet(),
success: true,
description: "Basic load of stylesheet",
},
{
href: nonexistentSheet(),
success: false,
description: "Attempted load of nonexistent stylesheet",
},
{
href: `data:text/css,@import url("${existingSheet()}")`,
success: true,
description: "Import of stylesheet",
},
{
href: `data:text/css,@import url("${nonexistentSheet()}")`,
success: false,
description: "Import of nonexistent stylesheet",
},
{
href: `data:text/css,@import url("data:text/css,@import url('${existingSheet()}')")`,
success: true,
description: "Import of import of stylesheet",
},
{
href: `data:text/css,@import url("data:text/css,@import url('${nonexistentSheet()}')")`,
success: false,
description: "Import of import of nonexistent stylesheet",
},
// Non-CSS-response tests.
{
href: makeUnique(""),
success: false,
description: "Load of non-CSS stylesheet",
},
{
href: `data:text/css,@import url("${makeUnique("")}")`,
success: false,
description: "Import of non-CSS stylesheet",
},
{
href: `data:text/css,@import url("data:text/css,@import url('${makeUnique("")}')")`,
success: false,
description: "Import of import of non-CSS stylesheet",
},
// http:// tests, to test what happens with mixed content blocking.
{
href: httpSheet(),
success: !isHttps,
description: "Load of http:// stylesheet",
},
{
href: `data:text/css,@import url("${httpSheet()}")`,
success: !isHttps,
description: "Import of http:// stylesheet",
},
{
href: `data:text/css,@import url("data:text/css,@import url('${httpSheet()}')")`,
success: !isHttps,
description: "Import of import of http:// stylesheet",
},
// https:// tests just as a control
{
href: httpsSheet(),
success: true,
description: "Load of https:// stylesheet",
},
{
href: `data:text/css,@import url("${httpsSheet()}")`,
success: true,
description: "Import of https:// stylesheet",
},
{
href: `data:text/css,@import url("data:text/css,@import url('${httpsSheet()}')")`,
success: true,
description: "Import of import of https:// stylesheet",
},
// Tests with multiple imports some of which are slow and some are fast.
{
href: `data:text/css,@import url("${slowResponse(existingSheet())}"); @import url("${nonexistentSheet()}");`,
success: false,
description: "Slow successful import, fast failing import",
},
{
href: `data:text/css,@import url("${existingSheet()}"); @import url("${slowResponse(nonexistentSheet())}");`,
success: false,
description: "Fast successful import, slow failing import",
}
];
// Note: Here we really do need to use "let" at least for the href,
// because we lazily evaluate it in the unreached cases.
for (var test of tests) {
let {href, success, description} = test;
var t = async_test(description);
var link = document.createElement("link");
link.rel = "stylesheet";
if (success) {
link.onload = t.step_func_done(() => {});
link.onerror = t.step_func_done(() => assert_unreached(`error fired when load expected: ${href}`) );
} else {
link.onerror = t.step_func_done(() => {});
link.onload = t.step_func_done(() => assert_unreached(`load fired when error expected: ${href}`) );
}
link.href = href;
document.head.appendChild(link);
}
/* Utility function */
function makeUnique(url) {
// Make sure we copy here, even if the thing coming in is a URL, so we don't
// mutate our caller's data.
url = new URL(url, location.href);
// We want to generate a unique URI to avoid the various caches browsers have
// for stylesheets. We don't want to just use a counter, because that would
// not be robust to the test being reloaded or othewise run multiple times
// without a browser restart. We don't want to use timstamps, because those
// are not likely to be unique across calls to this function, especially given
// the degraded timer resolution browsers have due to Spectre.
//
// So just fall back on Math.random() and assume it can't duplicate values.
url.searchParams.append("r", Math.random());
return url;
}
function existingSheet() {
return makeUnique("resources/good.css");
}
/**
* Function the add values to the "pipe" search param. See
* http://wptserve.readthedocs.io/en/latest/pipes.html for why one would do
* this. Because this param uses a weird '|'-separated syntax instead of just
* using multiple params with the same name, we need some manual code to munge
* the value properly.
*/
function addPipe(url, pipeVal) {
url = new URL(url, location.href);
var params = url.searchParams;
var oldVal = params.get("pipe");
if (oldVal) {
params.set("pipe", oldVal + "|" + pipeVal);
} else {
params.set("pipe", pipeVal);
}
return url;
}
function nonexistentSheet() {
return addPipe(existingSheet(), "status(404)");
}
function httpSheet() {
var url = existingSheet();
url.protocol = "http";
url.port = {{ports[http][0]}};
return url;
}
function httpsSheet() {
var url = existingSheet();
url.protocol = "https";
url.port = {{ports[https][0]}};
return url;
}
function slowResponse(url) {
return addPipe(url, "trickle(d1)");
}

View file

@ -0,0 +1,34 @@
<!DOCTYPE html>
<title>HTMLBodyElement event handlers</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<body>
<script>
function f() {
return 0;
}
var handlers = ['blur','error','focus','load','resize','scroll',
'afterprint','beforeprint','beforeunload','hashchange',
'languagechange','message','offline','online','pagehide',
'pageshow','popstate','storage','unload'];
handlers.forEach(function(handler) {
test(function() {
window['on' + handler] = f;
assert_equals(document.body['on' + handler], f);
}, handler);
});
handlers.forEach(function(handler) {
window['on' + handler] = null;
});
handlers.forEach(function(handler) {
test(function() {
assert_equals(window['on' + handler], null);
assert_equals(document.body['on' + handler], null);
}, handler + " removal");
});
</script>

View file

@ -32,6 +32,7 @@
test_timing_order('redirectStart', 'navigationStart');
test_timing_order('redirectEnd', 'redirectStart');
test_timing_order('fetchStart', 'redirectEnd');
test_timing_order('requestStart', 'fetchStart');
}
</script>

View file

@ -3,3 +3,4 @@
@domenic
@MSFTkihans
@mnoorenberghe
@edenchuang

View file

@ -220,7 +220,7 @@
});
testBadUpdate(this.textContent, badDetails, new RangeError());
">
Updating with a displayItem with an invalid currency results in TypeError.
Updating with a displayItem with an invalid currency results in RangeError.
</button></li>
<li><button onclick="

View file

@ -181,7 +181,7 @@ function runUpdateDetailsAlgorithm(
const request = new PaymentRequest(validMethods, failDetails, options);
const detailsPromise = Promise.resolve(details);
const acceptPromise = request.show(detailsPromise);
assert_equals(request.id, "this cant be changed", "id must never change.");
assert_equals(request.id, "this cannot be changed", "id must never change.");
await promise_rejects(
t,
"AbortError",

View file

@ -123,6 +123,28 @@ var fround =
})();
//@}
/// IdlHarnessError ///
// Entry point
self.IdlHarnessError = function(message)
//@{
{
/**
* Message to be printed as the error's toString invocation.
*/
this.message = message;
};
IdlHarnessError.prototype = Object.create(Error.prototype);
//@}
IdlHarnessError.prototype.toString = function()
//@{
{
return this.message;
};
//@}
/// IdlArray ///
// Entry point
self.IdlArray = function()
@ -217,7 +239,7 @@ IdlArray.prototype.internal_add_idls = function(parsed_idls, options)
if (options && options.only && options.except)
{
throw "The only and except options can't be used together."
throw new IdlHarnessError("The only and except options can't be used together.");
}
function should_skip(name)
@ -235,7 +257,7 @@ IdlArray.prototype.internal_add_idls = function(parsed_idls, options)
parsed_idls.forEach(function(parsed_idl)
{
if (parsed_idl.type == "interface" && parsed_idl.partial)
if (parsed_idl.partial && ["interface", "dictionary"].includes(parsed_idl.type))
{
if (should_skip(parsed_idl.name))
{
@ -280,7 +302,7 @@ IdlArray.prototype.internal_add_idls = function(parsed_idls, options)
}
if (parsed_idl.name in this.members)
{
throw "Duplicate identifier " + parsed_idl.name;
throw new IdlHarnessError("Duplicate identifier " + parsed_idl.name);
}
switch(parsed_idl.type)
{
@ -374,7 +396,7 @@ IdlArray.prototype.recursively_get_implements = function(interface_name)
ret = ret.concat(this.recursively_get_implements(ret[i]));
if (ret.indexOf(ret[i]) != ret.lastIndexOf(ret[i]))
{
throw "Circular implements statements involving " + ret[i];
throw new IdlHarnessError("Circular implements statements involving " + ret[i]);
}
}
return ret;
@ -404,7 +426,7 @@ IdlArray.prototype.recursively_get_includes = function(interface_name)
ret = ret.concat(this.recursively_get_includes(ret[i]));
if (ret.indexOf(ret[i]) != ret.lastIndexOf(ret[i]))
{
throw "Circular includes statements involving " + ret[i];
throw new IdlHarnessError("Circular includes statements involving " + ret[i]);
}
}
return ret;
@ -533,7 +555,7 @@ IdlArray.prototype.is_json_type = function(type)
function exposure_set(object, default_set) {
var exposed = object.extAttrs.filter(function(a) { return a.name == "Exposed" });
if (exposed.length > 1 || exposed.length < 0) {
throw "Unexpected Exposed extended attributes on " + memberName + ": " + exposed;
throw new IdlHarnessError("Unexpected Exposed extended attributes on " + memberName + ": " + exposed);
}
if (exposed.length === 0) {
@ -567,7 +589,33 @@ function exposed_in(globals) {
return globals.indexOf("Worker") >= 0 ||
globals.indexOf("ServiceWorker") >= 0;
}
throw "Unexpected global object";
throw new IdlHarnessError("Unexpected global object");
}
//@}
/**
* Asserts that the given error message is thrown for the given function.
* @param {string|IdlHarnessError} error Expected Error message.
* @param {Function} idlArrayFunc Function operating on an IdlArray that should throw.
*/
IdlArray.prototype.assert_throws = function(error, idlArrayFunc)
//@{
{
try {
idlArrayFunc.call(this, this);
throw new IdlHarnessError(`${idlArrayFunc} did not throw the expected IdlHarnessError`);
} catch (e) {
if (e instanceof AssertionError) {
throw e;
}
// Assertions for behaviour of the idlharness.js engine.
if (error instanceof IdlHarnessError) {
error = error.message;
}
if (e.message !== error) {
throw new IdlHarnessError(`${idlArrayFunc} threw ${e}, not the expected IdlHarnessError`);
}
}
}
//@}
@ -581,9 +629,10 @@ IdlArray.prototype.test = function()
this.partials.forEach(function(parsed_idl)
{
if (!(parsed_idl.name in this.members)
|| !(this.members[parsed_idl.name] instanceof IdlInterface))
|| !(this.members[parsed_idl.name] instanceof IdlInterface
|| this.members[parsed_idl.name] instanceof IdlDictionary))
{
throw "Partial interface " + parsed_idl.name + " with no original interface";
throw new IdlHarnessError(`Partial ${parsed_idl.type} ${parsed_idl.name} with no original ${parsed_idl.type}`);
}
if (parsed_idl.extAttrs)
{
@ -848,7 +897,7 @@ IdlArray.prototype.assert_type_is = function(value, type)
if (!(type in this.members))
{
throw "Unrecognized type " + type;
throw new IdlHarnessError("Unrecognized type " + type);
}
if (this.members[type] instanceof IdlInterface)
@ -876,7 +925,7 @@ IdlArray.prototype.assert_type_is = function(value, type)
}
else
{
throw "Type " + type + " isn't an interface or dictionary";
throw new IdlHarnessError("Type " + type + " isn't an interface or dictionary");
}
};
//@}
@ -1345,13 +1394,13 @@ IdlInterface.prototype.test_self = function()
{
var aliasAttrs = this.extAttrs.filter(function(o) { return o.name === "LegacyWindowAlias"; });
if (aliasAttrs.length > 1) {
throw "Invalid IDL: multiple LegacyWindowAlias extended attributes on " + this.name;
throw new IdlHarnessError("Invalid IDL: multiple LegacyWindowAlias extended attributes on " + this.name);
}
if (this.is_callback()) {
throw "Invalid IDL: LegacyWindowAlias extended attribute on non-interface " + this.name;
throw new IdlHarnessError("Invalid IDL: LegacyWindowAlias extended attribute on non-interface " + this.name);
}
if (this.exposureSet.indexOf("Window") === -1) {
throw "Invalid IDL: LegacyWindowAlias extended attribute on " + this.name + " which is not exposed in Window";
throw new IdlHarnessError("Invalid IDL: LegacyWindowAlias extended attribute on " + this.name + " which is not exposed in Window");
}
// TODO: when testing of [NoInterfaceObject] interfaces is supported,
// check that it's not specified together with LegacyWindowAlias.
@ -1360,7 +1409,7 @@ IdlInterface.prototype.test_self = function()
var rhs = aliasAttrs[0].rhs;
if (!rhs) {
throw "Invalid IDL: LegacyWindowAlias extended attribute on " + this.name + " without identifier";
throw new IdlHarnessError("Invalid IDL: LegacyWindowAlias extended attribute on " + this.name + " without identifier");
}
var aliases;
if (rhs.type === "identifier-list") {
@ -1733,7 +1782,7 @@ IdlInterface.prototype.test_member_const = function(member)
//@{
{
if (!this.has_constants()) {
throw "Internal error: test_member_const called without any constants";
throw new IdlHarnessError("Internal error: test_member_const called without any constants");
}
test(function()
@ -2289,7 +2338,7 @@ IdlInterface.prototype.test_object = function(desc)
{
if (!(current_interface.name in this.array.members))
{
throw "Interface " + current_interface.name + " not found (inherited by " + this.name + ")";
throw new IdlHarnessError("Interface " + current_interface.name + " not found (inherited by " + this.name + ")");
}
if (current_interface.prevent_multiple_testing && current_interface.already_tested)
{

View file

@ -87,7 +87,8 @@ class HTMLItem(pytest.Item, pytest.Collector):
@staticmethod
def _assert_sequence(nums):
assert nums == range(1, nums[-1] + 1)
if nums and len(nums) > 0:
assert nums == range(1, nums[-1] + 1)
@staticmethod
def _scrub_stack(test_obj):

View file

@ -0,0 +1,45 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>idlharness: partial dictionaries</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
<script src="/resources/idlharness.js"></script>
<script src="../helper.js"></script>
</head>
<body>
<pre id='idl'>
dictionary A {};
partial dictionary A {
boolean B;
};
partial dictionary A {
boolean C;
};
</pre>
<script>
'use strict';
test(() => {
let idlArray = new IdlArray();
idlArray.add_idls(document.getElementById('idl').textContent);
idlArray.test();
let members = idlArray.members["A"].members.map(m => m.name);
assert_array_equals(members, ["B", "C"], 'A should contain B, C');
}, 'Partial dictionaries');
test(() => {
let idlArray = new IdlArray();
idlArray.add_idls('partial dictionary D {};');
idlArray.assert_throws('Partial dictionary D with no original dictionary', i => i.test());
}, 'Partial-only dictionary definition')
</script>
</body>
</html>

View file

@ -29,6 +29,27 @@
test(function() {
assert_equals(typeof WebIDL2.parse("interface Foo {};"), "object");
}, 'WebIDL2 parse method should produce an AST for correct WebIDL');
for (let type of ['dictionary', 'interface']) {
test(function() {
let i = new IdlArray();
i.add_untested_idls(`partial ${type} A {};`);
i.assert_throws(new IdlHarnessError(`Partial ${type} A with no original ${type}`), i => i.test());
}, `assert_throws should handle ${type} IdlHarnessError`);
test(function() {
let i = new IdlArray();
i.add_untested_idls(`partial ${type} A {};`);
i.assert_throws(`Partial ${type} A with no original ${type}`, i => i.test());
}, `assert_throws should handle ${type} IdlHarnessError from message`);
test(function () {
try {
let i = new IdlArray();
i.add_untested_idls(`${type} A {};`);
i.assert_throws(`Partial ${type} A with no original ${type}`, i => i.test());
} catch (e) {
assert_true(e instanceof IdlHarnessError);
}
}, `assert_throws should throw if no ${type} IdlHarnessError thrown`);
}
</script>
</body>
</html>

View file

@ -1247,6 +1247,13 @@ policies and contribution forms [3].
}
expose(assert_readonly, "assert_readonly");
/**
* Assert an Exception with the expected code is thrown.
*
* @param {object|number|string} code The expected exception code.
* @param {Function} func Function which should throw.
* @param {string} description Error description for the case that the error is not thrown.
*/
function assert_throws(code, func, description)
{
try {

View file

@ -58,6 +58,30 @@ async_test(function(t) {
.catch(unreached_rejection(t));
}, 'Service Worker responds to fetch event with string');
async_test(function(t) {
var scope = 'resources/simple.html?string';
var frame;
service_worker_unregister_and_register(t, worker, scope)
.then(function(reg) {
return wait_for_state(t, reg.installing, 'activated');
})
.then(function() { return with_iframe(scope) })
.then(function(f) {
frame = f;
return frame.contentWindow.fetch(scope + "#foo")
})
.then(function(response) { return response.text() })
.then(function(text) {
assert_equals(
text,
'Test string',
'Service Worker should respond to fetch with a test string');
frame.remove();
return service_worker_unregister_and_done(t, scope);
})
.catch(unreached_rejection(t));
}, 'Service Worker responds to fetch event using request fragment with string');
async_test(function(t) {
var scope = 'resources/simple.html?blob';
service_worker_unregister_and_register(t, worker, scope)

View file

@ -0,0 +1,15 @@
<!DOCTYPE html>
<title>Layout using slot elements</title>
<link rel="author" title="Hayato Ito" href="mailto:hayato@google.com"/>
<link rel="help" href="https://dom.spec.whatwg.org/#shadow-tree-slots">
<link rel="match" href="reference/empty.html"/>
<div id="host"></div>
<script>
const host = document.querySelector('#host');
const sr = host.attachShadow({ mode: 'open' });
sr.innerHTML = '<slot name=s1></slot>'
host.innerHTML = '<div id=d1 slot=s1></div>';
document.body.offsetLeft;
document.querySelector('#d1').setAttribute('slot', 's2');
</script>

View file

@ -0,0 +1,15 @@
<!DOCTYPE html>
<title>Layout using slot elements</title>
<link rel="author" title="Hayato Ito" href="mailto:hayato@google.com"/>
<link rel="help" href="https://dom.spec.whatwg.org/#shadow-tree-slots">
<link rel="match" href="reference/empty.html"/>
<div id="host"></div>
<script>
const host = document.querySelector('#host');
const sr = host.attachShadow({ mode: 'open' });
sr.innerHTML = '<slot><div id="fallback">Should not be displayed</div></slot>'
document.body.offsetLeft;
host.appendChild(document.createElement('div'));
</script>

View file

@ -0,0 +1 @@
<!DOCTYPE html>

View file

@ -102,7 +102,19 @@ class SubtestResultRecorder(object):
self.record(report.nodeid, "PASS")
def record_fail(self, report):
self.record(report.nodeid, "FAIL", stack=report.longrepr)
# pytest outputs the stacktrace followed by an error message prefixed
# with "E ", e.g.
#
# def test_example():
# > assert "fuu" in "foobar"
# > E AssertionError: assert 'fuu' in 'foobar'
message = ""
for line in report.longreprtext.splitlines():
if line.startswith("E "):
message = line[1:].strip()
break
self.record(report.nodeid, "FAIL", message=message, stack=report.longrepr)
def record_error(self, report):
# error in setup/teardown

View file

@ -12,6 +12,12 @@ def maximize(session):
return session.transport.send("POST", "session/%s/window/maximize" % session.session_id)
def is_fullscreen(session):
# At the time of writing, WebKit does not conform to the Fullscreen API specification.
# Remove the prefixed fallback when https://bugs.webkit.org/show_bug.cgi?id=158125 is fixed.
return session.execute_script("return !!(window.fullScreen || document.webkitIsFullScreen)")
# 10.7.3 Maximize Window
@ -137,11 +143,11 @@ def test_fully_exit_fullscreen(session):
"""
session.window.fullscreen()
assert session.execute_script("return window.fullScreen") is True
assert is_fullscreen(session) is True
response = maximize(session)
assert_success(response)
assert session.execute_script("return window.fullScreen") is False
assert is_fullscreen(session) is False
def test_restore_the_window(session):

View file

@ -51,6 +51,39 @@ def test_find_element(session, using, value):
assert_success(response)
@pytest.mark.parametrize("document,value", [
("<a href=#>link text</a>", "link text"),
("<a href=#>&nbsp;link text&nbsp;</a>", "link text"),
("<a href=#>link<br>text</a>", "link\ntext"),
("<a href=#>link&amp;text</a>", "link&text"),
("<a href=#>LINK TEXT</a>", "LINK TEXT"),
("<a href=# style='text-transform: uppercase'>link text</a>", "LINK TEXT"),
])
def test_find_element_link_text(session, document, value):
# Step 8 - 9
session.url = inline(document)
response = find_element(session, "link text", value)
assert_success(response)
@pytest.mark.parametrize("document,value", [
("<a href=#>partial link text</a>", "link"),
("<a href=#>&nbsp;partial link text&nbsp;</a>", "link"),
("<a href=#>partial link text</a>", "k t"),
("<a href=#>partial link<br>text</a>", "k\nt"),
("<a href=#>partial link&amp;text</a>", "k&t"),
("<a href=#>PARTIAL LINK TEXT</a>", "LINK"),
("<a href=# style='text-transform: uppercase'>partial link text</a>", "LINK"),
])
def test_find_element_partial_link_text(session, document, value):
# Step 8 - 9
session.url = inline(document)
response = find_element(session, "partial link text", value)
assert_success(response)
@pytest.mark.parametrize("using,value", [("css selector", "#wontExist")])
def test_no_element(session, using, value):
# Step 8 - 9
@ -65,7 +98,8 @@ def test_no_element(session, using, value):
("tag name", "a"),
("xpath", "//*[name()='a']")])
def test_xhtml_namespace(session, using, value):
session.url = inline("""<a href="#" id="linkText">full link text</a>""", doctype="xhtml")
session.url = inline("""<a href="#" id="linkText">full link text</a>""",
doctype="xhtml")
expected = session.execute_script("return document.links[0]")
response = find_element(session, using, value)

View file

@ -31,7 +31,6 @@ def test_closed_context(session, create_window):
session.close()
response = find_element(session, "notReal", "css selector", "foo")
assert_error(response, "no such window")
@ -49,6 +48,41 @@ def test_find_element(session, using, value):
assert_success(response)
@pytest.mark.parametrize("document,value", [
("<a href=#>link text</a>", "link text"),
("<a href=#>&nbsp;link text&nbsp;</a>", "link text"),
("<a href=#>link<br>text</a>", "link\ntext"),
("<a href=#>link&amp;text</a>", "link&text"),
("<a href=#>LINK TEXT</a>", "LINK TEXT"),
("<a href=# style='text-transform: uppercase'>link text</a>", "LINK TEXT"),
])
def test_find_element_link_text(session, document, value):
# Step 8 - 9
session.url = inline("<div>{0}</div>".format(document))
element = session.find.css("div", all=False)
response = find_element(session, element.id, "link text", value)
assert_success(response)
@pytest.mark.parametrize("document,value", [
("<a href=#>partial link text</a>", "link"),
("<a href=#>&nbsp;partial link text&nbsp;</a>", "link"),
("<a href=#>partial link text</a>", "k t"),
("<a href=#>partial link<br>text</a>", "k\nt"),
("<a href=#>partial link&amp;text</a>", "k&t"),
("<a href=#>PARTIAL LINK TEXT</a>", "LINK"),
("<a href=# style='text-transform: uppercase'>partial link text</a>", "LINK"),
])
def test_find_element_partial_link_text(session, document, value):
# Step 8 - 9
session.url = inline("<div>{0}</div>".format(document))
element = session.find.css("div", all=False)
response = find_element(session, element.id, "partial link text", value)
assert_success(response)
@pytest.mark.parametrize("using,value",[("css selector", "#wontExist")])
def test_no_element(session, using, value):
# Step 8 - 9
@ -65,7 +99,8 @@ def test_no_element(session, using, value):
("tag name", "a"),
("xpath", "//*[name()='a']")])
def test_xhtml_namespace(session, using, value):
session.url = inline("""<p><a href="#" id="linkText">full link text</a></p>""", doctype="xhtml")
session.url = inline("""<p><a href="#" id="linkText">full link text</a></p>""",
doctype="xhtml")
from_element = session.execute_script("""return document.querySelector("p")""")
expected = session.execute_script("return document.links[0]")

View file

@ -30,10 +30,7 @@ def test_closed_context(session, create_window):
session.window_handle = new_window
session.close()
response = session.transport.send("POST",
"session/%s/elements" % session.session_id,
{"using": "css selector", "value": "foo"})
response = find_elements(session, "css selector", "foo")
assert_error(response, "no such window")
@ -52,6 +49,51 @@ def test_find_elements(session, using, value):
assert len(response.body["value"]) == 1
@pytest.mark.parametrize("document,value", [
("<a href=#>link text</a>", "link text"),
("<a href=#>&nbsp;link text&nbsp;</a>", "link text"),
("<a href=#>link<br>text</a>", "link\ntext"),
("<a href=#>link&amp;text</a>", "link&text"),
("<a href=#>LINK TEXT</a>", "LINK TEXT"),
("<a href=# style='text-transform: uppercase'>link text</a>", "LINK TEXT"),
])
def test_find_elements_link_text(session, document, value):
# Step 8 - 9
session.url = inline("<a href=#>not wanted</a><br/>{0}".format(document))
expected = session.execute_script("return document.links[1];")
response = find_elements(session, "link text", value)
value = assert_success(response)
assert isinstance(value, list)
assert len(value) == 1
found_element = value[0]
assert_same_element(session, found_element, expected)
@pytest.mark.parametrize("document,value", [
("<a href=#>partial link text</a>", "link"),
("<a href=#>&nbsp;partial link text&nbsp;</a>", "link"),
("<a href=#>partial link text</a>", "k t"),
("<a href=#>partial link<br>text</a>", "k\nt"),
("<a href=#>partial link&amp;text</a>", "k&t"),
("<a href=#>PARTIAL LINK TEXT</a>", "LINK"),
("<a href=# style='text-transform: uppercase'>partial link text</a>", "LINK"),
])
def test_find_elements_partial_link_text(session, document, value):
# Step 8 - 9
session.url = inline("<a href=#>not wanted</a><br/>{0}".format(document))
expected = session.execute_script("return document.links[1];")
response = find_elements(session, "partial link text", value)
value = assert_success(response)
assert isinstance(value, list)
assert len(value) == 1
found_element = value[0]
assert_same_element(session, found_element, expected)
@pytest.mark.parametrize("using,value", [("css selector", "#wontExist")])
def test_no_element(session, using, value):
# Step 8 - 9
@ -67,8 +109,9 @@ def test_no_element(session, using, value):
("tag name", "a"),
("xpath", "//*[name()='a']")])
def test_xhtml_namespace(session, using, value):
session.url = inline("""<p><a href="#" id="linkText">full link text</a></p>""", doctype="xhtml")
expected = session.execute_script("return document.links[0]")
session.url = inline("""<a href="#" id="linkText">full link text</a>""",
doctype="xhtml")
expected = session.execute_script("return document.links[0];")
response = find_elements(session, using, value)
value = assert_success(response)

View file

@ -48,6 +48,53 @@ def test_find_elements(session, using, value):
assert_success(response)
@pytest.mark.parametrize("document,value", [
("<a href=#>link text</a>", "link text"),
("<a href=#>&nbsp;link text&nbsp;</a>", "link text"),
("<a href=#>link<br>text</a>", "link\ntext"),
("<a href=#>link&amp;text</a>", "link&text"),
("<a href=#>LINK TEXT</a>", "LINK TEXT"),
("<a href=# style='text-transform: uppercase'>link text</a>", "LINK TEXT"),
])
def test_find_elements_link_text(session, document, value):
# Step 8 - 9
session.url = inline("<div><a href=#>not wanted</a><br/>{0}</div>".format(document))
element = session.find.css("div", all=False)
expected = session.execute_script("return document.links[1];")
response = find_elements(session, element.id, "link text", value)
value = assert_success(response)
assert isinstance(value, list)
assert len(value) == 1
found_element = value[0]
assert_same_element(session, found_element, expected)
@pytest.mark.parametrize("document,value", [
("<a href=#>partial link text</a>", "link"),
("<a href=#>&nbsp;partial link text&nbsp;</a>", "link"),
("<a href=#>partial link text</a>", "k t"),
("<a href=#>partial link<br>text</a>", "k\nt"),
("<a href=#>partial link&amp;text</a>", "k&t"),
("<a href=#>PARTIAL LINK TEXT</a>", "LINK"),
("<a href=# style='text-transform: uppercase'>partial link text</a>", "LINK"),
])
def test_find_elements_partial_link_text(session, document, value):
# Step 8 - 9
session.url = inline("<div><a href=#>not wanted</a><br/>{0}</div>".format(document))
element = session.find.css("div", all=False)
expected = session.execute_script("return document.links[1];")
response = find_elements(session, element.id, "partial link text", value)
value = assert_success(response)
assert isinstance(value, list)
assert len(value) == 1
found_element = value[0]
assert_same_element(session, found_element, expected)
@pytest.mark.parametrize("using,value", [("css selector", "#wontExist")])
def test_no_element(session, using, value):
# Step 8 - 9
@ -64,7 +111,8 @@ def test_no_element(session, using, value):
("tag name", "a"),
("xpath", "//*[name()='a']")])
def test_xhtml_namespace(session, using, value):
session.url = inline("""<p><a href="#" id="linkText">full link text</a></p>""", doctype="xhtml")
session.url = inline("""<p><a href="#" id="linkText">full link text</a></p>""",
doctype="xhtml")
from_element = session.execute_script("""return document.querySelector("p")""")
expected = session.execute_script("return document.links[0]")

View file

@ -16,6 +16,12 @@ def fullscreen(session):
return session.transport.send("POST", "session/%s/window/fullscreen" % session.session_id)
def is_fullscreen(session):
# At the time of writing, WebKit does not conform to the Fullscreen API specification.
# Remove the prefixed fallback when https://bugs.webkit.org/show_bug.cgi?id=158125 is fixed.
return session.execute_script("return !!(window.fullScreen || document.webkitIsFullScreen)")
# 10.7.5 Fullscreen Window
@ -135,11 +141,6 @@ def test_handle_prompt_missing_value(session, create_dialog):
assert read_global(session, "dismiss3") == None
def is_fullscreen(session):
# At the time of writing, WebKit does not conform to the Fullscreen API specification.
# Remove the prefixed fallback when https://bugs.webkit.org/show_bug.cgi?id=158125 is fixed.
return session.execute_script("return !!(window.fullScreen || document.webkitIsFullScreen)")
def test_fullscreen(session):
"""
4. Call fullscreen an element with the current top-level browsing

View file

@ -10,6 +10,11 @@ def minimize(session):
return session.transport.send("POST", "session/%s/window/minimize" % session.session_id)
def is_fullscreen(session):
# At the time of writing, WebKit does not conform to the Fullscreen API specification.
# Remove the prefixed fallback when https://bugs.webkit.org/show_bug.cgi?id=158125 is fixed.
return session.execute_script("return !!(window.fullScreen || document.webkitIsFullScreen)")
# 10.7.4 Minimize Window
@ -135,11 +140,11 @@ def test_fully_exit_fullscreen(session):
"""
session.window.fullscreen()
assert session.execute_script("return window.fullScreen") is True
assert is_fullscreen(session) is True
response = minimize(session)
assert_success(response)
assert session.execute_script("return window.fullScreen") is False
assert is_fullscreen(session) is False
assert session.execute_script("return document.hidden") is True

View file

@ -13,6 +13,11 @@ alert_doc = inline("<script>window.alert()</script>")
def set_window_rect(session, rect):
return session.transport.send("POST", "session/%s/window/rect" % session.session_id, rect)
def is_fullscreen(session):
# At the time of writing, WebKit does not conform to the Fullscreen API specification.
# Remove the prefixed fallback when https://bugs.webkit.org/show_bug.cgi?id=158125 is fixed.
return session.execute_script("return !!(window.fullScreen || document.webkitIsFullScreen)")
# 10.7.2 Set Window Rect
@ -293,14 +298,14 @@ def test_fully_exit_fullscreen(session):
3. Exit fullscreen document.
"""
session.window.fullscreen()
assert session.execute_script("return window.fullScreen") is True
assert is_fullscreen(session) is True
response = set_window_rect(session, {"width": 400, "height": 400})
value = assert_success(response)
assert value["width"] == 400
assert value["height"] == 400
assert session.execute_script("return window.fullScreen") is False
assert is_fullscreen(session) is False
def test_restore_from_minimized(session):

View file

@ -378,6 +378,52 @@
}));
}, 'replaceTrack(): original track attachment stats present after replacing');
promise_test(async function() {
const caller = new RTCPeerConnection();
const callee = new RTCPeerConnection();
let [tracks, streams] = await getUserMediaTracksAndStreams(2);
let sender = caller.addTrack(tracks[0], streams[0]);
callee.addTrack(tracks[1], streams[1]);
exchangeIceCandidates(caller, callee);
await doSignalingHandshake(caller, callee);
await onIceConnectionStateCompleted(caller);
let receiver = caller.getReceivers()[0];
// Obtain inbound and outbound RTP stream stats on a full stats report.
let fullReport = await caller.getStats();
let outboundTrackStats = findStatsByTypeAndId(
fullReport, 'track', sender.track.id);
let outboundStats = findStatsByTypeAndMember(
fullReport, 'outbound-rtp', 'trackId', outboundTrackStats.id);
assert_true(outboundStats != null, 'Has stats for outbound RTP stream');
let inboundTrackStats = findStatsByTypeAndId(
fullReport, 'track', receiver.track.id);
let inboundStats = findStatsByTypeAndMember(
fullReport, 'inbound-rtp', 'trackId', inboundTrackStats.id);
assert_true(inboundStats != null, 'Has stats for inbound RTP stream');
// Perform stats selection algorithm with sender selector. The result should
// contain the outbound-rtp but not the inbound-rtp.
let senderReport = await sender.getStats();
assert_true(senderReport.has(outboundStats.id));
assert_false(senderReport.has(inboundStats.id));
// Validate the stats graph, ensuring all stats objects are reachable and
// valid from the outbound-rtp stats.
validateStatsGraph(senderReport, senderReport.get(outboundStats.id));
// Ensure that the stats graph contains some expected dictionaries.
assert_equals(findStatsOfType(senderReport, 'track').length, 1,
'senderReport should contain track stats');
assert_equals(findStatsOfType(senderReport, 'transport').length, 1,
'senderReport should contain transport stats');
assert_equals(findStatsOfType(senderReport, 'candidate-pair').length, 1,
'senderReport should contain candidate-pair stats');
assert_equals(findStatsOfType(senderReport, 'local-candidate').length, 1,
'senderReport should contain local-candidate stats');
assert_equals(findStatsOfType(senderReport, 'remote-candidate').length, 1,
'senderReport should contain remote-candidate stats');
}, 'RTCRtpSender.getStats() contains only outbound-rtp and related stats');
// Helpers.
function findStatsByTypeAndId(report, type, identifier) {
@ -400,4 +446,53 @@
return null;
}
function findStatsOfType(report, type) {
let stats = [];
for (let it = report.values(), n = it.next(); !n.done; n = it.next()) {
if (n.value.type == type)
stats.push(n.value);
}
return stats;
}
// Returns a promise that is resolved when pc.iceConnectionState changes to
// 'completed'. This is when transport stats can be expected to have its
// selectedCandidatePairId defined.
async function onIceConnectionStateCompleted(pc) {
let resolver = new Resolver();
pc.oniceconnectionstatechange = e => {
if (pc.iceConnectionState == 'completed')
resolver.resolve();
};
return resolver.promise;
}
// Explores the stats graph starting from |stat|, validating each stat
// (validateRtcStats) and asserting that all stats of the report were visited.
function validateStatsGraph(report, stat) {
let visitedIds = new Set();
validateStatsGraphRecursively(report, stat.id, visitedIds);
assert_equals(visitedIds.size, report.size,
'Entire stats graph should have been explored.')
}
function validateStatsGraphRecursively(report, currentId, visitedIds) {
if (visitedIds.has(currentId))
return;
visitedIds.add(currentId);
assert_true(report.has(currentId), 'Broken reference.');
let stat = report.get(currentId);
validateRtcStats(report, stat);
for (let member in stat) {
if (member.endsWith('Id')) {
validateStatsGraphRecursively(report, stat[member], visitedIds);
} else if (member.endsWith('Ids')) {
let ids = stat[member];
for (let i = 0; i < ids.length; ++i) {
validateStatsGraphRecursively(report, ids[i], visitedIds);
}
}
}
}
</script>

View file

@ -3,6 +3,7 @@
<title>RTCRtpSender.prototype.getStats</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="RTCPeerConnection-helper.js"></script>
<script src="dictionary-helper.js"></script>
<script src="RTCStats-helper.js"></script>
<script>
@ -12,6 +13,9 @@
// webrtc-pc 20171130
// webrtc-stats 20171122
// The following helper functions are called from RTCPeerConnection-helper.js:
// doSignalingHandshake
// The following helper function is called from RTCStats-helper.js
// validateStatsReport
// assert_stats_report_has_stats
@ -35,31 +39,28 @@
objects added.
*/
promise_test(() => {
const pc = new RTCPeerConnection();
const { sender } = pc.addTransceiver('audio');
promise_test(async () => {
const caller = new RTCPeerConnection();
const callee = new RTCPeerConnection();
const { sender } = caller.addTransceiver('audio');
return sender.getStats()
.then(statsReport => {
validateStatsReport(statsReport);
assert_stats_report_has_stats(statsReport, ['outbound-rtp']);
});
await doSignalingHandshake(caller, callee);
const statsReport = await sender.getStats();
validateStatsReport(statsReport);
assert_stats_report_has_stats(statsReport, ['outbound-rtp']);
}, 'sender.getStats() via addTransceiver should return stats report containing outbound-rtp stats');
promise_test(() => {
const pc = new RTCPeerConnection();
promise_test(async () => {
const caller = new RTCPeerConnection();
const callee = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({audio:true});
const [track] = stream.getTracks();
const sender = caller.addTrack(track, stream);
return navigator.mediaDevices.getUserMedia({ audio: true })
.then(mediaStream => {
const [track] = mediaStream.getTracks();
const sender = pc.addTrack(track, mediaStream);
return sender.getStats()
.then(statsReport => {
validateStatsReport(statsReport);
assert_stats_report_has_stats(statsReport, ['outbound-rtp']);
});
})
await doSignalingHandshake(caller, callee);
const statsReport = await sender.getStats();
validateStatsReport(statsReport);
assert_stats_report_has_stats(statsReport, ['outbound-rtp']);
}, 'sender.getStats() via addTrack should return stats report containing outbound-rtp stats');
</script>